Analisar o retorno real/nominal para vários ativos para um período de X anos baseado na performance dos últimos 10 anos
Motivação da análise:
https://cartadocondado.substack.com/p/ipca6-e-o-quase-almoco-gratis
A Carta do Condado mostrou que o IPCA+6% tem a segunda melhor performance dos últimos 10 anos, gostaria de analisar se essa performance é apenas um fato de hoje (viés temporal) ou a estratégia performa bem independente do tempo da análise
Para simplificar a análise, vamos considerar os principais ativos apenas.
Ativos a se considerar:
Estudo divulgado na Carta (26/05/2024)

%%capture
!pip install sgs
!pip install
import requests
import pandas as pd
import numpy as np
import datetime
import yfinance as yf
import plotly.express as px
pd.set_option('display.max_rows', 1000)
pd.set_option('display.max_columns', 100)
# URL da API do Banco Central do Brasil para o IPCA (série temporal 433)
url = 'https://api.bcb.gov.br/dados/serie/bcdata.sgs.433/dados?formato=json'
# Fazer a requisição para a API do Banco Central do Brasil
response = requests.get(url)
data = response.json()
# Transformar os dados em um DataFrame do Pandas
ipca = pd.DataFrame(data)
# Converter a coluna 'data' para o tipo datetime
ipca['data'] = pd.to_datetime(ipca['data'], dayfirst=True)
# Converter a coluna 'valor' para o tipo float
ipca['valor'] = ipca['valor'].astype(float)
ipca.head()
| data | valor | |
|---|---|---|
| 0 | 1980-01-01 | 6.62 |
| 1 | 1980-02-01 | 4.62 |
| 2 | 1980-03-01 | 6.04 |
| 3 | 1980-04-01 | 5.29 |
| 4 | 1980-05-01 | 5.70 |
ipca.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 532 entries, 0 to 531 Data columns (total 2 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 data 532 non-null datetime64[ns] 1 valor 532 non-null float64 dtypes: datetime64[ns](1), float64(1) memory usage: 8.4 KB
ipca['data'].min(), ipca['data'].max()
(Timestamp('1980-01-01 00:00:00'), Timestamp('2024-04-01 00:00:00'))
ipca.tail(5)
| data | valor | |
|---|---|---|
| 527 | 2023-12-01 | 0.56 |
| 528 | 2024-01-01 | 0.42 |
| 529 | 2024-02-01 | 0.83 |
| 530 | 2024-03-01 | 0.16 |
| 531 | 2024-04-01 | 0.38 |
Temos os dados do IPCA numa granularidade mês com dados de 1980 até 2024.
São dados mais que suficientes pra nossa análise.
Vamos ter que trabalhar um pouco em cima destes dados para gerar uma visão do 'acumulado' do último ano, por exemplo. Mas vamos deixar isso para uma etapa posterior.
# URL da API do Banco Central do Brasil para Selic (série temporal 432)
url = 'https://api.bcb.gov.br/dados/serie/bcdata.sgs.432/dados?formato=json'
# Fazer a requisição para a API do Banco Central do Brasil
response = requests.get(url)
data = response.json()
# Transformar os dados em um DataFrame do Pandas
selic = pd.DataFrame(data)
# Converter a coluna 'data' para o tipo datetime
selic['data'] = pd.to_datetime(selic['data'], dayfirst=True)
# Converter a coluna 'valor' para o tipo float
selic['valor'] = selic['valor'].astype(float)
selic.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 9239 entries, 0 to 9238 Data columns (total 2 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 data 9239 non-null datetime64[ns] 1 valor 9239 non-null float64 dtypes: datetime64[ns](1), float64(1) memory usage: 144.5 KB
# Exibir as primeiras linhas do DataFrame
selic.head()
| data | valor | |
|---|---|---|
| 0 | 1999-03-05 | 45.0 |
| 1 | 1999-03-06 | 45.0 |
| 2 | 1999-03-07 | 45.0 |
| 3 | 1999-03-08 | 45.0 |
| 4 | 1999-03-09 | 45.0 |
selic['data'].min(), selic['data'].max()
(Timestamp('1999-03-05 00:00:00'), Timestamp('2024-06-19 00:00:00'))
# Ordenar os dados por data
selic = selic.sort_values('data')
# Exibir as últimas linhas do DataFrame com o acumulado dos últimos 12 meses
display(selic.tail(15))
| data | valor | |
|---|---|---|
| 9224 | 2024-06-05 | 10.5 |
| 9225 | 2024-06-06 | 10.5 |
| 9226 | 2024-06-07 | 10.5 |
| 9227 | 2024-06-08 | 10.5 |
| 9228 | 2024-06-09 | 10.5 |
| 9229 | 2024-06-10 | 10.5 |
| 9230 | 2024-06-11 | 10.5 |
| 9231 | 2024-06-12 | 10.5 |
| 9232 | 2024-06-13 | 10.5 |
| 9233 | 2024-06-14 | 10.5 |
| 9234 | 2024-06-15 | 10.5 |
| 9235 | 2024-06-16 | 10.5 |
| 9236 | 2024-06-17 | 10.5 |
| 9237 | 2024-06-18 | 10.5 |
| 9238 | 2024-06-19 | 10.5 |
# Sanity check: vamos checar se os valores da Selic 2024 está de acordo com os valores que sabemos
filtro_2024 = selic['data'] >= datetime.datetime(2024, 1, 1)
valores_selic_2024 = selic[filtro_2024]['valor'].unique()
print(f'valores da Selic em 2024: {valores_selic_2024}')
valores da Selic em 2024: [11.75 11.25 10.75 10.5 ]
# URL da API do Banco Central do Brasil para CDI (série temporal 12)
url = 'https://api.bcb.gov.br/dados/serie/bcdata.sgs.12/dados?formato=json'
# Fazer a requisição para a API do Banco Central do Brasil
response = requests.get(url)
data = response.json()
# Transformar os dados em um DataFrame do Pandas
cdi = pd.DataFrame(data)
# Converter a coluna 'data' para o tipo datetime
cdi['data'] = pd.to_datetime(cdi['data'], dayfirst=True)
# Converter a coluna 'valor' para o tipo float
cdi['valor'] = cdi['valor'].astype(float)
cdi.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 9563 entries, 0 to 9562 Data columns (total 2 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 data 9563 non-null datetime64[ns] 1 valor 9563 non-null float64 dtypes: datetime64[ns](1), float64(1) memory usage: 149.5 KB
# Exibir as primeiras linhas do DataFrame
cdi.head()
| data | valor | |
|---|---|---|
| 0 | 1986-03-06 | 0.068111 |
| 1 | 1986-03-10 | 0.069028 |
| 2 | 1986-03-12 | 0.067417 |
| 3 | 1986-03-14 | 0.064584 |
| 4 | 1986-03-17 | 0.068222 |
cdi['data'].min(), cdi['data'].max()
(Timestamp('1986-03-06 00:00:00'), Timestamp('2024-05-29 00:00:00'))
# Ordenar os dados por data
cdi = cdi.sort_values('data')
Para calcular corretamente o acumulado do CDI, é importante lembrar que o CDI é uma taxa de juros e, normalmente, o que se quer é o acumulado dos rendimentos diários, e não a soma simples dos valores. O cálculo do CDI acumulado envolve multiplicar os fatores de rendimento diário.
Passos:
# Calcular o fator diário de rendimento
cdi['fator'] = (1 + cdi['valor'] / 100)
# Função para calcular o acumulado para os últimos <dias> dias corridos
def calcular_acumulado_dias(cdi, data_col, fator_col, dias):
cdi[f'cdi_acum_{str(dias)}d'] = np.nan
for i in range(len(cdi)):
end_date = cdi[data_col].iloc[i]
start_date = end_date - pd.Timedelta(days=dias)
mask = (cdi[data_col] > start_date) & (cdi[data_col] <= end_date)
cdi.at[i, f'cdi_acum_{str(dias)}d'] = cdi.loc[mask, fator_col].prod() - 1
return cdi
# Aplicar a função ao DataFrame
# 1 ano
cdi = calcular_acumulado_dias(cdi, 'data', 'fator', 365)
# 10 anos
cdi = calcular_acumulado_dias(cdi, 'data', 'fator', 365*10)
cdi.tail()
| data | valor | fator | cdi_acum_365d | cdi_acum_3650d | |
|---|---|---|---|---|---|
| 9558 | 2024-05-23 | 0.03927 | 1.000393 | 0.120575 | 1.422814 |
| 9559 | 2024-05-24 | 0.03927 | 1.000393 | 0.120446 | 1.422780 |
| 9560 | 2024-05-27 | 0.03927 | 1.000393 | 0.120317 | 1.420774 |
| 9561 | 2024-05-28 | 0.03927 | 1.000393 | 0.120188 | 1.421724 |
| 9562 | 2024-05-29 | 0.03927 | 1.000393 | 0.120059 | 1.422675 |
cdi[cdi['data'] <= datetime.datetime(2021,12,31)].tail()
| data | valor | fator | cdi_acum_365d | cdi_acum_3650d | |
|---|---|---|---|---|---|
| 8955 | 2021-12-27 | 0.034749 | 1.000347 | 0.043098 | 1.225740 |
| 8956 | 2021-12-28 | 0.034749 | 1.000347 | 0.043382 | 1.226513 |
| 8957 | 2021-12-29 | 0.034749 | 1.000347 | 0.043667 | 1.227287 |
| 8958 | 2021-12-30 | 0.034749 | 1.000347 | 0.043951 | 1.227147 |
| 8959 | 2021-12-31 | 0.034749 | 1.000347 | 0.044236 | 1.227008 |
# URL da API do Banco Central do Brasil para o câmbio do dólar (série temporal 1)
url = 'https://api.bcb.gov.br/dados/serie/bcdata.sgs.1/dados?formato=json'
# Fazer a requisição para a API do Banco Central do Brasil
response = requests.get(url)
data = response.json()
# Transformar os dados em um DataFrame do Pandas
dolar = pd.DataFrame(data)
# Converter a coluna 'data' para o tipo datetime
dolar['data'] = pd.to_datetime(dolar['data'], dayfirst=True)
# Converter a coluna 'valor' para o tipo float
dolar['valor'] = dolar['valor'].astype(float)
# Exibir as primeiras linhas do DataFrame
display(dolar.head())
| data | valor | |
|---|---|---|
| 0 | 1984-11-28 | 2828.0 |
| 1 | 1984-11-29 | 2828.0 |
| 2 | 1984-11-30 | 2881.0 |
| 3 | 1984-12-03 | 2881.0 |
| 4 | 1984-12-04 | 2881.0 |
dolar['data'].min(), dolar['data'].max()
(Timestamp('1984-11-28 00:00:00'), Timestamp('2024-05-31 00:00:00'))
# Ordenar os dados por data
dolar = dolar.sort_values('data')
# Exibir as últimas linhas do DataFrame com o acumulado dos últimos 12 meses
display(dolar.tail(15))
| data | valor | |
|---|---|---|
| 9882 | 2024-05-10 | 5.1464 |
| 9883 | 2024-05-13 | 5.1412 |
| 9884 | 2024-05-14 | 5.1356 |
| 9885 | 2024-05-15 | 5.1423 |
| 9886 | 2024-05-16 | 5.1270 |
| 9887 | 2024-05-17 | 5.1157 |
| 9888 | 2024-05-20 | 5.1085 |
| 9889 | 2024-05-21 | 5.1037 |
| 9890 | 2024-05-22 | 5.1502 |
| 9891 | 2024-05-23 | 5.1443 |
| 9892 | 2024-05-24 | 5.1508 |
| 9893 | 2024-05-27 | 5.1704 |
| 9894 | 2024-05-28 | 5.1538 |
| 9895 | 2024-05-29 | 5.1972 |
| 9896 | 2024-05-31 | 5.2416 |
# Obter os dados do Ibovespa (use o ticker '^BVSP' para o Ibovespa)
ibovespa = yf.download('^BVSP', start='1990-01-01', end='2024-05-01')
[*********************100%***********************] 1 of 1 completed
ibovespa = (
ibovespa
.reset_index()
)
ibovespa['data'] = pd.to_datetime(ibovespa['Date'], dayfirst=True)
ibovespa = (
ibovespa
.sort_values(by=['data'], ascending=True)
)
ibovespa.info()
<class 'pandas.core.frame.DataFrame'> Int64Index: 7676 entries, 0 to 7675 Data columns (total 8 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Date 7676 non-null datetime64[ns] 1 Open 7676 non-null float64 2 High 7676 non-null float64 3 Low 7676 non-null float64 4 Close 7676 non-null float64 5 Adj Close 7676 non-null float64 6 Volume 7676 non-null int64 7 data 7676 non-null datetime64[ns] dtypes: datetime64[ns](2), float64(5), int64(1) memory usage: 539.7 KB
# Exibir as primeiras linhas do DataFrame
display(ibovespa.head())
| Date | Open | High | Low | Close | Adj Close | Volume | data | |
|---|---|---|---|---|---|---|---|---|
| 0 | 1993-04-27 | 24.799999 | 25.400000 | 24.500000 | 24.500000 | 24.500000 | 0 | 1993-04-27 |
| 1 | 1993-04-28 | 24.500000 | 24.600000 | 23.700001 | 24.299999 | 24.299999 | 0 | 1993-04-28 |
| 2 | 1993-04-29 | 24.299999 | 24.799999 | 23.700001 | 23.700001 | 23.700001 | 0 | 1993-04-29 |
| 3 | 1993-04-30 | 23.700001 | 24.200001 | 23.700001 | 24.100000 | 24.100000 | 0 | 1993-04-30 |
| 4 | 1993-05-03 | 24.100000 | 24.400000 | 23.799999 | 24.100000 | 24.100000 | 0 | 1993-05-03 |
display(ibovespa.tail())
| Date | Open | High | Low | Close | Adj Close | Volume | data | |
|---|---|---|---|---|---|---|---|---|
| 7671 | 2024-04-24 | 125149.0 | 125473.0 | 124556.0 | 124741.0 | 124741.0 | 10526300 | 2024-04-24 |
| 7672 | 2024-04-25 | 124718.0 | 124732.0 | 123703.0 | 124646.0 | 124646.0 | 10093100 | 2024-04-25 |
| 7673 | 2024-04-26 | 124651.0 | 126826.0 | 124651.0 | 126526.0 | 126526.0 | 8900000 | 2024-04-26 |
| 7674 | 2024-04-29 | 126527.0 | 127352.0 | 126467.0 | 127352.0 | 127352.0 | 8385100 | 2024-04-29 |
| 7675 | 2024-04-30 | 127352.0 | 127352.0 | 125856.0 | 125924.0 | 125924.0 | 10889600 | 2024-04-30 |
ibovespa['data'].min(), ibovespa['data'].max()
(Timestamp('1993-04-27 00:00:00'), Timestamp('2024-04-30 00:00:00'))
# Obter os dados do sp&500 (use o ticker '^GSPC' para o Ibovespa)
sp500 = yf.download('^GSPC', start='1990-01-01', end='2024-05-01')
[*********************100%***********************] 1 of 1 completed
sp500 = (
sp500
.reset_index()
)
sp500['data'] = pd.to_datetime(sp500['Date'], dayfirst=True)
sp500 = (
sp500
.sort_values(by=['data'], ascending=True)
)
# Exibir as primeiras linhas do DataFrame
display(sp500.head())
| Date | Open | High | Low | Close | Adj Close | Volume | data | |
|---|---|---|---|---|---|---|---|---|
| 0 | 1990-01-02 | 353.399994 | 359.690002 | 351.980011 | 359.690002 | 359.690002 | 162070000 | 1990-01-02 |
| 1 | 1990-01-03 | 359.690002 | 360.589996 | 357.890015 | 358.760010 | 358.760010 | 192330000 | 1990-01-03 |
| 2 | 1990-01-04 | 358.760010 | 358.760010 | 352.890015 | 355.670013 | 355.670013 | 177000000 | 1990-01-04 |
| 3 | 1990-01-05 | 355.670013 | 355.670013 | 351.350006 | 352.200012 | 352.200012 | 158530000 | 1990-01-05 |
| 4 | 1990-01-08 | 352.200012 | 354.239990 | 350.540009 | 353.790009 | 353.790009 | 140110000 | 1990-01-08 |
display(sp500.tail())
| Date | Open | High | Low | Close | Adj Close | Volume | data | |
|---|---|---|---|---|---|---|---|---|
| 8643 | 2024-04-24 | 5084.859863 | 5089.479980 | 5047.020020 | 5071.629883 | 5071.629883 | 3656740000 | 2024-04-24 |
| 8644 | 2024-04-25 | 5019.879883 | 5057.750000 | 4990.580078 | 5048.419922 | 5048.419922 | 3958050000 | 2024-04-25 |
| 8645 | 2024-04-26 | 5084.649902 | 5114.620117 | 5073.140137 | 5099.959961 | 5099.959961 | 3604140000 | 2024-04-26 |
| 8646 | 2024-04-29 | 5114.129883 | 5123.490234 | 5088.649902 | 5116.169922 | 5116.169922 | 3447450000 | 2024-04-29 |
| 8647 | 2024-04-30 | 5103.779785 | 5110.830078 | 5035.310059 | 5035.689941 | 5035.689941 | 4082470000 | 2024-04-30 |
sp500['data'].min(), sp500['data'].max()
(Timestamp('1990-01-02 00:00:00'), Timestamp('2024-04-30 00:00:00'))
# Obter os dados Nasdaq (use o ticker '^^IXIC)
nasdaq = yf.download('^IXIC', start='1990-01-01', end='2024-05-01')
[*********************100%***********************] 1 of 1 completed
nasdaq = (
nasdaq
.reset_index()
)
nasdaq['data'] = pd.to_datetime(nasdaq['Date'], dayfirst=True)
nasdaq = (
nasdaq
.sort_values(by=['data'], ascending=True)
)
# Exibir as primeiras linhas do DataFrame
display(nasdaq.head())
| Date | Open | High | Low | Close | Adj Close | Volume | data | |
|---|---|---|---|---|---|---|---|---|
| 0 | 1990-01-02 | 452.899994 | 459.299988 | 452.700012 | 459.299988 | 459.299988 | 110720000 | 1990-01-02 |
| 1 | 1990-01-03 | 461.100006 | 461.600006 | 460.000000 | 460.899994 | 460.899994 | 152660000 | 1990-01-03 |
| 2 | 1990-01-04 | 460.399994 | 460.799988 | 456.899994 | 459.399994 | 459.399994 | 147950000 | 1990-01-04 |
| 3 | 1990-01-05 | 457.899994 | 459.399994 | 457.799988 | 458.200012 | 458.200012 | 137230000 | 1990-01-05 |
| 4 | 1990-01-08 | 457.100006 | 458.700012 | 456.500000 | 458.700012 | 458.700012 | 115500000 | 1990-01-08 |
display(nasdaq.tail())
| Date | Open | High | Low | Close | Adj Close | Volume | data | |
|---|---|---|---|---|---|---|---|---|
| 8643 | 2024-04-24 | 15805.599609 | 15839.000000 | 15634.440430 | 15712.750000 | 15712.750000 | 4735870000 | 2024-04-24 |
| 8644 | 2024-04-25 | 15375.259766 | 15644.509766 | 15343.910156 | 15611.759766 | 15611.759766 | 4743640000 | 2024-04-25 |
| 8645 | 2024-04-26 | 15821.339844 | 15981.000000 | 15770.719727 | 15927.900391 | 15927.900391 | 4694400000 | 2024-04-26 |
| 8646 | 2024-04-29 | 16007.000000 | 16021.490234 | 15885.889648 | 15983.080078 | 15983.080078 | 4972520000 | 2024-04-29 |
| 8647 | 2024-04-30 | 15920.889648 | 15979.360352 | 15655.669922 | 15657.820312 | 15657.820312 | 5229400000 | 2024-04-30 |
nasdaq['data'].min(), nasdaq['data'].max()
(Timestamp('1990-01-02 00:00:00'), Timestamp('2024-04-30 00:00:00'))
# Obter os dados Fundos Imobiliários (use o ticker '^IFIX)
ouro = yf.download('GC=F', start='1990-01-01', end='2024-05-01')
[*********************100%***********************] 1 of 1 completed
ouro = (
ouro
.reset_index()
)
ouro['data'] = pd.to_datetime(ouro['Date'], dayfirst=True)
ouro = (
ouro
.sort_values(by=['data'], ascending=True)
)
# Exibir as primeiras linhas do DataFrame
display(ouro.head())
| Date | Open | High | Low | Close | Adj Close | Volume | data | |
|---|---|---|---|---|---|---|---|---|
| 0 | 2000-08-30 | 273.899994 | 273.899994 | 273.899994 | 273.899994 | 273.899994 | 0 | 2000-08-30 |
| 1 | 2000-08-31 | 274.799988 | 278.299988 | 274.799988 | 278.299988 | 278.299988 | 0 | 2000-08-31 |
| 2 | 2000-09-01 | 277.000000 | 277.000000 | 277.000000 | 277.000000 | 277.000000 | 0 | 2000-09-01 |
| 3 | 2000-09-05 | 275.799988 | 275.799988 | 275.799988 | 275.799988 | 275.799988 | 2 | 2000-09-05 |
| 4 | 2000-09-06 | 274.200012 | 274.200012 | 274.200012 | 274.200012 | 274.200012 | 0 | 2000-09-06 |
display(ouro.tail())
| Date | Open | High | Low | Close | Adj Close | Volume | data | |
|---|---|---|---|---|---|---|---|---|
| 5933 | 2024-04-24 | 2321.300049 | 2328.699951 | 2314.600098 | 2324.500000 | 2324.500000 | 95 | 2024-04-24 |
| 5934 | 2024-04-25 | 2315.000000 | 2329.800049 | 2305.000000 | 2329.800049 | 2329.800049 | 1024 | 2024-04-25 |
| 5935 | 2024-04-26 | 2347.899902 | 2347.899902 | 2332.800049 | 2334.800049 | 2334.800049 | 717 | 2024-04-26 |
| 5936 | 2024-04-29 | 2334.800049 | 2345.500000 | 2327.899902 | 2345.399902 | 2345.399902 | 405 | 2024-04-29 |
| 5937 | 2024-04-30 | 2322.500000 | 2322.500000 | 2291.399902 | 2291.399902 | 2291.399902 | 113 | 2024-04-30 |
ouro['data'].min(), ouro['data'].max()
(Timestamp('2000-08-30 00:00:00'), Timestamp('2024-04-30 00:00:00'))
Vamos consolidar os dados para a granularidade da nossa análise (ano) e (ano/mês) e calcular os retornos acumulados nos últimos 10 anos de forma "rolling/móvel"
Vamos agregar os valores de dia para mês utilizando a mediana
ipca.head(3)
| data | valor | |
|---|---|---|
| 0 | 1980-01-01 | 6.62 |
| 1 | 1980-02-01 | 4.62 |
| 2 | 1980-03-01 | 6.04 |
ipca.tail(3)
| data | valor | |
|---|---|---|
| 529 | 2024-02-01 | 0.83 |
| 530 | 2024-03-01 | 0.16 |
| 531 | 2024-04-01 | 0.38 |
# check de sanidade de dados duplicados
print(ipca['data'].shape[0], ipca.drop_duplicates(subset=['data']).shape[0])
532 532
# cria coluna ano-mês
ipca['ano-mês'] = ipca['data'].dt.to_period('M')
# converte para string para plot
ipca['ano-mês'] = ipca['ano-mês'].astype(str)
ipca_consolidado = ipca.copy()
ipca_consolidado['ipca_acum_12m'] = (
ipca_consolidado['valor']
.rolling(window=12, min_periods=1, closed='left')
.sum()
)
ipca_consolidado['ipca_acum_10y'] = (
ipca_consolidado['valor']
.rolling(window=12*10, min_periods=1, closed='left')
.sum()
)
ipca_consolidado = ipca_consolidado.drop('data', axis=1)
ipca_consolidado = ipca_consolidado.rename(columns = {'valor' : 'ipca'})
# validação dos dados
filtro_ipca_inferior = ipca_consolidado['ano-mês'] >= '2008-01-01'
filtro_ipca_superior = ipca_consolidado['ano-mês'] <= '2023-12-01'
fig = px.line(ipca_consolidado[filtro_ipca_inferior & filtro_ipca_superior],
x='ano-mês',
y='ipca_acum_12m',
title='IPCA Acumulado nos Últimos 12 Meses',
markers=True)
fig.show()
Vamos comparar com dados do IBGE/Banco Central
selic
| data | valor | |
|---|---|---|
| 0 | 1999-03-05 | 45.0 |
| 1 | 1999-03-06 | 45.0 |
| 2 | 1999-03-07 | 45.0 |
| 3 | 1999-03-08 | 45.0 |
| 4 | 1999-03-09 | 45.0 |
| ... | ... | ... |
| 9234 | 2024-06-15 | 10.5 |
| 9235 | 2024-06-16 | 10.5 |
| 9236 | 2024-06-17 | 10.5 |
| 9237 | 2024-06-18 | 10.5 |
| 9238 | 2024-06-19 | 10.5 |
9239 rows × 2 columns
# check de sanidade de dados duplicados
print(selic['data'].shape[0], selic.drop_duplicates(subset=['data']).shape[0])
9239 9239
# cria coluna ano-mês
selic['ano-mês'] = selic['data'].dt.to_period('M')
# converte para string para plot
selic['ano-mês'] = selic['ano-mês'].astype(str)
selic.info()
<class 'pandas.core.frame.DataFrame'> Int64Index: 9239 entries, 0 to 9238 Data columns (total 3 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 data 9239 non-null datetime64[ns] 1 valor 9239 non-null float64 2 ano-mês 9239 non-null object dtypes: datetime64[ns](1), float64(1), object(1) memory usage: 288.7+ KB
selic_consolidado = (
selic
.groupby('ano-mês')
.agg(
selic = ('valor', 'median')
)
.reset_index()
.sort_values(by=['ano-mês'], ascending=True)
)
# validação dos dados
filtro_selic_inferior = selic_consolidado['ano-mês'] >= '2013-01-01'
filtro_selic_superior = selic_consolidado['ano-mês'] <= '2023-12-01'
fig = px.line(selic_consolidado[filtro_selic_inferior & filtro_selic_superior],
x='ano-mês',
y='selic',
title='evolução da taxa Selic (% ao ano)',
markers=True)
fig.show()
Vamos comparar com dados do Banco Central
cdi.head(3)
| data | valor | fator | cdi_acum_365d | cdi_acum_3650d | |
|---|---|---|---|---|---|
| 0 | 1986-03-06 | 0.068111 | 1.000681 | 0.000681 | 0.000681 |
| 1 | 1986-03-10 | 0.069028 | 1.000690 | 0.001372 | 0.001372 |
| 2 | 1986-03-12 | 0.067417 | 1.000674 | 0.002047 | 0.002047 |
# check de sanidade de dados duplicados
print(cdi['data'].shape[0], cdi.drop_duplicates(subset=['data']).shape[0])
9563 9563
# cria coluna ano-mês
cdi['ano-mês'] = cdi['data'].dt.to_period('M')
# converte para string para plot
cdi['ano-mês'] = cdi['ano-mês'].astype(str)
cdi_consolidado = (
cdi
.groupby('ano-mês')
.agg(
cdi_acum_365d = ('cdi_acum_365d', 'median'),
cdi_acum_3650d = ('cdi_acum_3650d', 'median'),
)
.reset_index()
.sort_values(by=['ano-mês'], ascending=True)
)
cdi_consolidado
| ano-mês | cdi_acum_365d | cdi_acum_3650d | |
|---|---|---|---|
| 0 | 1986-03 | 0.004706 | 4.705862e-03 |
| 1 | 1986-04 | 0.015916 | 1.591599e-02 |
| 2 | 1986-05 | 0.029556 | 2.955569e-02 |
| 3 | 1986-06 | 0.044334 | 4.433380e-02 |
| 4 | 1986-07 | 0.063897 | 6.389657e-02 |
| 5 | 1986-08 | 0.090380 | 9.038005e-02 |
| 6 | 1986-09 | 0.125320 | 1.253204e-01 |
| 7 | 1986-10 | 0.163644 | 1.636437e-01 |
| 8 | 1986-11 | 0.209698 | 2.096978e-01 |
| 9 | 1986-12 | 0.310693 | 3.106927e-01 |
| 10 | 1987-01 | 0.475052 | 4.750519e-01 |
| 11 | 1987-02 | 0.749700 | 7.497002e-01 |
| 12 | 1987-03 | 1.058633 | 1.066277e+00 |
| 13 | 1987-04 | 1.332204 | 1.367804e+00 |
| 14 | 1987-05 | 1.837172 | 1.921031e+00 |
| 15 | 1987-06 | 2.461115 | 2.614559e+00 |
| 16 | 1987-07 | 2.782858 | 3.024570e+00 |
| 17 | 1987-08 | 3.000990 | 3.362599e+00 |
| 18 | 1987-09 | 3.240033 | 3.775024e+00 |
| 19 | 1987-10 | 3.449990 | 4.178202e+00 |
| 20 | 1987-11 | 3.812494 | 4.821678e+00 |
| 21 | 1987-12 | 4.119900 | 5.710632e+00 |
| 22 | 1988-01 | 4.269154 | 6.746821e+00 |
| 23 | 1988-02 | 4.336493 | 8.185575e+00 |
| 24 | 1988-03 | 4.291688 | 9.859538e+00 |
| 25 | 1988-04 | 4.375812 | 1.183613e+01 |
| 26 | 1988-05 | 4.284531 | 1.443624e+01 |
| 27 | 1988-06 | 4.057743 | 1.724315e+01 |
| 28 | 1988-07 | 4.498094 | 2.112746e+01 |
| 29 | 1988-08 | 5.397897 | 2.691146e+01 |
| 30 | 1988-09 | 6.161503 | 3.333480e+01 |
| 31 | 1988-10 | 7.508341 | 4.305791e+01 |
| 32 | 1988-11 | 8.778306 | 5.604017e+01 |
| 33 | 1988-12 | 9.756959 | 7.166127e+01 |
| 34 | 1989-01 | 11.117559 | 9.405095e+01 |
| 35 | 1989-02 | 11.208705 | 1.116694e+02 |
| 36 | 1989-03 | 11.557648 | 1.352015e+02 |
| 37 | 1989-04 | 11.438611 | 1.571014e+02 |
| 38 | 1989-05 | 10.328040 | 1.733910e+02 |
| 39 | 1989-06 | 10.175808 | 2.028835e+02 |
| 40 | 1989-07 | 11.301773 | 2.712070e+02 |
| 41 | 1989-08 | 12.033821 | 3.627930e+02 |
| 42 | 1989-09 | 13.522140 | 4.948724e+02 |
| 43 | 1989-10 | 15.181191 | 7.119095e+02 |
| 44 | 1989-11 | 17.366317 | 1.052810e+03 |
| 45 | 1989-12 | 21.564602 | 1.619185e+03 |
| 46 | 1990-01 | 27.700249 | 2.716293e+03 |
| 47 | 1990-02 | 42.183551 | 4.768447e+03 |
| 48 | 1990-03 | 57.479431 | 8.122309e+03 |
| 49 | 1990-04 | 55.353417 | 8.928808e+03 |
| 50 | 1990-05 | 52.344994 | 9.325602e+03 |
| 51 | 1990-06 | 48.087595 | 1.000693e+04 |
| 52 | 1990-07 | 40.780893 | 1.129165e+04 |
| 53 | 1990-08 | 34.113953 | 1.277321e+04 |
| 54 | 1990-09 | 28.706080 | 1.461374e+04 |
| 55 | 1990-10 | 23.828395 | 1.769940e+04 |
| 56 | 1990-11 | 19.513172 | 2.161539e+04 |
| 57 | 1990-12 | 15.696309 | 2.638354e+04 |
| 58 | 1991-01 | 11.501299 | 3.396713e+04 |
| 59 | 1991-02 | 6.567397 | 3.933613e+04 |
| 60 | 1991-03 | 4.362229 | 4.285357e+04 |
| 61 | 1991-04 | 4.401245 | 4.805516e+04 |
| 62 | 1991-05 | 4.846322 | 5.445417e+04 |
| 63 | 1991-06 | 5.031259 | 6.009464e+04 |
| 64 | 1991-07 | 4.985620 | 6.740468e+04 |
| 65 | 1991-08 | 5.026125 | 7.677448e+04 |
| 66 | 1991-09 | 5.277674 | 9.117773e+04 |
| 67 | 1991-10 | 5.326637 | 1.107939e+05 |
| 68 | 1991-11 | 5.811043 | 1.452723e+05 |
| 69 | 1991-12 | 6.158552 | 1.894537e+05 |
| 70 | 1992-01 | 6.257590 | 2.466760e+05 |
| 71 | 1992-02 | 7.188928 | 3.183864e+05 |
| 72 | 1992-03 | 8.409962 | 4.098880e+05 |
| 73 | 1992-04 | 9.644072 | 5.107292e+05 |
| 74 | 1992-05 | 10.501955 | 6.281415e+05 |
| 75 | 1992-06 | 11.942457 | 7.757092e+05 |
| 76 | 1992-07 | 13.324094 | 9.708830e+05 |
| 77 | 1992-08 | 14.878927 | 1.223448e+06 |
| 78 | 1992-09 | 15.846084 | 1.551241e+06 |
| 79 | 1992-10 | 16.750093 | 1.984614e+06 |
| 80 | 1992-11 | 16.374119 | 2.539953e+06 |
| 81 | 1992-12 | 15.461112 | 3.135076e+06 |
| 82 | 1993-01 | 15.331935 | 4.028724e+06 |
| 83 | 1993-02 | 15.827786 | 5.208443e+06 |
| 84 | 1993-03 | 15.627385 | 6.675736e+06 |
| 85 | 1993-04 | 15.846995 | 8.703734e+06 |
| 86 | 1993-05 | 17.135688 | 1.133382e+07 |
| 87 | 1993-06 | 18.072313 | 1.494875e+07 |
| 88 | 1993-07 | 19.397613 | 1.970416e+07 |
| 89 | 1993-08 | 20.639635 | 2.633240e+07 |
| 90 | 1993-09 | 22.055853 | 3.576520e+07 |
| 91 | 1993-10 | 24.139567 | 4.960134e+07 |
| 92 | 1993-11 | 26.129606 | 6.863819e+07 |
| 93 | 1993-12 | 28.690911 | 9.355823e+07 |
| 94 | 1994-01 | 32.678534 | 1.348388e+08 |
| 95 | 1994-02 | 35.467190 | 1.960032e+08 |
| 96 | 1994-03 | 40.451743 | 2.753118e+08 |
| 97 | 1994-04 | 46.861711 | 4.106864e+08 |
| 98 | 1994-05 | 52.173609 | 5.988944e+08 |
| 99 | 1994-06 | 58.642413 | 8.915794e+08 |
| 100 | 1994-07 | 55.738609 | 1.117953e+09 |
| 101 | 1994-08 | 43.760724 | 1.170768e+09 |
| 102 | 1994-09 | 33.035771 | 1.217296e+09 |
| 103 | 1994-10 | 24.258887 | 1.263048e+09 |
| 104 | 1994-11 | 18.123054 | 1.312496e+09 |
| 105 | 1994-12 | 13.480853 | 1.364895e+09 |
| 106 | 1995-01 | 9.574699 | 1.414079e+09 |
| 107 | 1995-02 | 6.484907 | 1.461811e+09 |
| 108 | 1995-03 | 4.455210 | 1.514495e+09 |
| 109 | 1995-04 | 2.856758 | 1.583918e+09 |
| 110 | 1995-05 | 1.755866 | 1.650354e+09 |
| 111 | 1995-06 | 0.927852 | 1.718833e+09 |
| 112 | 1995-07 | 0.602331 | 1.788359e+09 |
| 113 | 1995-08 | 0.586967 | 1.857971e+09 |
| 114 | 1995-09 | 0.581548 | 1.923486e+09 |
| 115 | 1995-10 | 0.573487 | 1.983660e+09 |
| 116 | 1995-11 | 0.556204 | 2.042511e+09 |
| 117 | 1995-12 | 0.540316 | 2.098902e+09 |
| 118 | 1996-01 | 0.523207 | 2.153936e+09 |
| 119 | 1996-02 | 0.508211 | 2.206698e+09 |
| 120 | 1996-03 | 0.489811 | 2.246394e+09 |
| 121 | 1996-04 | 0.452556 | 2.263859e+09 |
| 122 | 1996-05 | 0.421104 | 2.278805e+09 |
| 123 | 1996-06 | 0.394708 | 2.291667e+09 |
| 124 | 1996-07 | 0.365947 | 2.292880e+09 |
| 125 | 1996-08 | 0.339271 | 2.277463e+09 |
| 126 | 1996-09 | 0.320551 | 2.247537e+09 |
| 127 | 1996-10 | 0.302257 | 2.215029e+09 |
| 128 | 1996-11 | 0.289334 | 2.164265e+09 |
| 129 | 1996-12 | 0.275718 | 2.016608e+09 |
| 130 | 1997-01 | 0.264409 | 1.830668e+09 |
| 131 | 1997-02 | 0.254404 | 1.508020e+09 |
| 132 | 1997-03 | 0.250708 | 1.368759e+09 |
| 133 | 1997-04 | 0.245121 | 1.200927e+09 |
| 134 | 1997-05 | 0.240188 | 9.872881e+08 |
| 135 | 1997-06 | 0.234785 | 8.035667e+08 |
| 136 | 1997-07 | 0.230024 | 7.426036e+08 |
| 137 | 1997-08 | 0.226379 | 6.971353e+08 |
| 138 | 1997-09 | 0.222397 | 6.447073e+08 |
| 139 | 1997-10 | 0.219029 | 6.050442e+08 |
| 140 | 1997-11 | 0.226020 | 5.478748e+08 |
| 141 | 1997-12 | 0.239726 | 4.874421e+08 |
| 142 | 1998-01 | 0.252822 | 4.355465e+08 |
| 143 | 1998-02 | 0.263372 | 3.791844e+08 |
| 144 | 1998-03 | 0.265953 | 3.236582e+08 |
| 145 | 1998-04 | 0.269908 | 2.828728e+08 |
| 146 | 1998-05 | 0.270657 | 2.357522e+08 |
| 147 | 1998-06 | 0.270785 | 2.035023e+08 |
| 148 | 1998-07 | 0.271485 | 1.708466e+08 |
| 149 | 1998-08 | 0.271237 | 1.358508e+08 |
| 150 | 1998-09 | 0.274018 | 1.148050e+08 |
| 151 | 1998-10 | 0.290649 | 9.100114e+07 |
| 152 | 1998-11 | 0.295742 | 7.168505e+07 |
| 153 | 1998-12 | 0.290027 | 5.853682e+07 |
| 154 | 1999-01 | 0.282246 | 4.562147e+07 |
| 155 | 1999-02 | 0.281957 | 4.054537e+07 |
| 156 | 1999-03 | 0.290050 | 3.318719e+07 |
| 157 | 1999-04 | 0.300502 | 2.979445e+07 |
| 158 | 1999-05 | 0.307674 | 2.736072e+07 |
| 159 | 1999-06 | 0.308585 | 2.394202e+07 |
| 160 | 1999-07 | 0.308619 | 1.823357e+07 |
| 161 | 1999-08 | 0.308603 | 1.360967e+07 |
| 162 | 1999-09 | 0.303884 | 1.031125e+07 |
| 163 | 1999-10 | 0.286402 | 7.140008e+06 |
| 164 | 1999-11 | 0.267278 | 4.979065e+06 |
| 165 | 1999-12 | 0.254516 | 3.197801e+06 |
| 166 | 2000-01 | 0.247947 | 1.906393e+06 |
| 167 | 2000-02 | 0.235588 | 1.065006e+06 |
| 168 | 2000-03 | 0.216349 | 6.870571e+05 |
| 169 | 2000-04 | 0.203689 | 6.374447e+05 |
| 170 | 2000-05 | 0.192871 | 6.159338e+05 |
| 171 | 2000-06 | 0.190386 | 5.836589e+05 |
| 172 | 2000-07 | 0.186766 | 5.147578e+05 |
| 173 | 2000-08 | 0.183961 | 4.673397e+05 |
| 174 | 2000-09 | 0.181579 | 4.071376e+05 |
| 175 | 2000-10 | 0.179613 | 3.411160e+05 |
| 176 | 2000-11 | 0.177787 | 2.853326e+05 |
| 177 | 2000-12 | 0.175880 | 2.343688e+05 |
| 178 | 2001-01 | 0.171770 | 1.849114e+05 |
| 179 | 2001-02 | 0.168909 | 1.657451e+05 |
| 180 | 2001-03 | 0.165807 | 1.505652e+05 |
| 181 | 2001-04 | 0.163140 | 1.350008e+05 |
| 182 | 2001-05 | 0.161741 | 1.220470e+05 |
| 183 | 2001-06 | 0.160404 | 1.113002e+05 |
| 184 | 2001-07 | 0.161016 | 1.006192e+05 |
| 185 | 2001-08 | 0.163212 | 9.016887e+04 |
| 186 | 2001-09 | 0.165363 | 7.516677e+04 |
| 187 | 2001-10 | 0.167444 | 6.373968e+04 |
| 188 | 2001-11 | 0.169567 | 4.826377e+04 |
| 189 | 2001-12 | 0.171680 | 3.724507e+04 |
| 190 | 2002-01 | 0.174407 | 3.009365e+04 |
| 191 | 2002-02 | 0.176636 | 2.305274e+04 |
| 192 | 2002-03 | 0.180361 | 1.915720e+04 |
| 193 | 2002-04 | 0.182801 | 1.515945e+04 |
| 194 | 2002-05 | 0.184533 | 1.257549e+04 |
| 195 | 2002-06 | 0.185506 | 1.016598e+04 |
| 196 | 2002-07 | 0.185757 | 8.322026e+03 |
| 197 | 2002-08 | 0.184828 | 6.733250e+03 |
| 198 | 2002-09 | 0.184434 | 5.297437e+03 |
| 199 | 2002-10 | 0.184681 | 4.287533e+03 |
| 200 | 2002-11 | 0.187000 | 3.354594e+03 |
| 201 | 2002-12 | 0.189091 | 2.711252e+03 |
| 202 | 2003-01 | 0.193665 | 2.197617e+03 |
| 203 | 2003-02 | 0.200390 | 1.638573e+03 |
| 204 | 2003-03 | 0.204292 | 1.349728e+03 |
| 205 | 2003-04 | 0.210670 | 1.088327e+03 |
| 206 | 2003-05 | 0.215834 | 8.400393e+02 |
| 207 | 2003-06 | 0.223535 | 6.535944e+02 |
| 208 | 2003-07 | 0.228992 | 5.039707e+02 |
| 209 | 2003-08 | 0.234879 | 3.847608e+02 |
| 210 | 2003-09 | 0.238536 | 2.857191e+02 |
| 211 | 2003-10 | 0.239855 | 2.103960e+02 |
| 212 | 2003-11 | 0.238842 | 1.529351e+02 |
| 213 | 2003-12 | 0.235759 | 1.118749e+02 |
| 214 | 2004-01 | 0.228646 | 7.928745e+01 |
| 215 | 2004-02 | 0.221568 | 5.574643e+01 |
| 216 | 2004-03 | 0.213537 | 3.823928e+01 |
| 217 | 2004-04 | 0.204278 | 2.597637e+01 |
| 218 | 2004-05 | 0.197436 | 1.714752e+01 |
| 219 | 2004-06 | 0.188024 | 1.185445e+01 |
| 220 | 2004-07 | 0.180477 | 9.562532e+00 |
| 221 | 2004-08 | 0.172981 | 9.201757e+00 |
| 222 | 2004-09 | 0.166897 | 8.964302e+00 |
| 223 | 2004-10 | 0.163201 | 8.716854e+00 |
| 224 | 2004-11 | 0.159825 | 8.457941e+00 |
| 225 | 2004-12 | 0.159713 | 8.221683e+00 |
| 226 | 2005-01 | 0.162388 | 8.016329e+00 |
| 227 | 2005-02 | 0.163031 | 7.811106e+00 |
| 228 | 2005-03 | 0.165807 | 7.656744e+00 |
| 229 | 2005-04 | 0.168419 | 7.411411e+00 |
| 230 | 2005-05 | 0.171409 | 7.173118e+00 |
| 231 | 2005-06 | 0.174784 | 6.982052e+00 |
| 232 | 2005-07 | 0.178206 | 6.788757e+00 |
| 233 | 2005-08 | 0.181664 | 6.605208e+00 |
| 234 | 2005-09 | 0.185049 | 6.468281e+00 |
| 235 | 2005-10 | 0.187726 | 6.337922e+00 |
| 236 | 2005-11 | 0.189591 | 6.238921e+00 |
| 237 | 2005-12 | 0.190666 | 6.135347e+00 |
| 238 | 2006-01 | 0.190796 | 6.060252e+00 |
| 239 | 2006-02 | 0.191425 | 5.990037e+00 |
| 240 | 2006-03 | 0.188826 | 5.918231e+00 |
| 241 | 2006-04 | 0.186918 | 5.866415e+00 |
| 242 | 2006-05 | 0.182750 | 5.810341e+00 |
| 243 | 2006-06 | 0.179046 | 5.752576e+00 |
| 244 | 2006-07 | 0.175222 | 5.704801e+00 |
| 245 | 2006-08 | 0.170829 | 5.658212e+00 |
| 246 | 2006-09 | 0.166297 | 5.602412e+00 |
| 247 | 2006-10 | 0.161987 | 5.557453e+00 |
| 248 | 2006-11 | 0.157674 | 5.506880e+00 |
| 249 | 2006-12 | 0.153583 | 5.458656e+00 |
| 250 | 2007-01 | 0.148111 | 5.414106e+00 |
| 251 | 2007-02 | 0.144728 | 5.376716e+00 |
| 252 | 2007-03 | 0.141388 | 5.317494e+00 |
| 253 | 2007-04 | 0.138085 | 5.278737e+00 |
| 254 | 2007-05 | 0.136067 | 5.240399e+00 |
| 255 | 2007-06 | 0.133173 | 5.199922e+00 |
| 256 | 2007-07 | 0.130704 | 5.164757e+00 |
| 257 | 2007-08 | 0.127794 | 5.125197e+00 |
| 258 | 2007-09 | 0.125244 | 5.080118e+00 |
| 259 | 2007-10 | 0.122802 | 5.042284e+00 |
| 260 | 2007-11 | 0.120682 | 4.932200e+00 |
| 261 | 2007-12 | 0.118925 | 4.823193e+00 |
| 262 | 2008-01 | 0.117218 | 4.719147e+00 |
| 263 | 2008-02 | 0.115135 | 4.614639e+00 |
| 264 | 2008-03 | 0.114380 | 4.559038e+00 |
| 265 | 2008-04 | 0.113087 | 4.504924e+00 |
| 266 | 2008-05 | 0.111967 | 4.461687e+00 |
| 267 | 2008-06 | 0.111580 | 4.423126e+00 |
| 268 | 2008-07 | 0.111778 | 4.389771e+00 |
| 269 | 2008-08 | 0.112887 | 4.361408e+00 |
| 270 | 2008-09 | 0.114781 | 4.314750e+00 |
| 271 | 2008-10 | 0.117493 | 4.229066e+00 |
| 272 | 2008-11 | 0.120487 | 4.138210e+00 |
| 273 | 2008-12 | 0.122323 | 4.067108e+00 |
| 274 | 2009-01 | 0.124430 | 4.016638e+00 |
| 275 | 2009-02 | 0.126482 | 3.945687e+00 |
| 276 | 2009-03 | 0.126746 | 3.845822e+00 |
| 277 | 2009-04 | 0.126740 | 3.767652e+00 |
| 278 | 2009-05 | 0.126038 | 3.701259e+00 |
| 279 | 2009-06 | 0.124394 | 3.658994e+00 |
| 280 | 2009-07 | 0.121688 | 3.620672e+00 |
| 281 | 2009-08 | 0.118174 | 3.580265e+00 |
| 282 | 2009-09 | 0.113970 | 3.546599e+00 |
| 283 | 2009-10 | 0.109220 | 3.514202e+00 |
| 284 | 2009-11 | 0.104684 | 3.481650e+00 |
| 285 | 2009-12 | 0.100796 | 3.449187e+00 |
| 286 | 2010-01 | 0.096713 | 3.410902e+00 |
| 287 | 2010-02 | 0.093608 | 3.382340e+00 |
| 288 | 2010-03 | 0.090574 | 3.348356e+00 |
| 289 | 2010-04 | 0.088431 | 3.315432e+00 |
| 290 | 2010-05 | 0.087738 | 3.287507e+00 |
| 291 | 2010-06 | 0.087449 | 3.258234e+00 |
| 292 | 2010-07 | 0.088372 | 3.238768e+00 |
| 293 | 2010-08 | 0.089974 | 3.219046e+00 |
| 294 | 2010-09 | 0.091673 | 3.201534e+00 |
| 295 | 2010-10 | 0.093305 | 3.183964e+00 |
| 296 | 2010-11 | 0.094681 | 3.166940e+00 |
| 297 | 2010-12 | 0.096263 | 3.149028e+00 |
| 298 | 2011-01 | 0.098755 | 3.137153e+00 |
| 299 | 2011-02 | 0.100950 | 3.125396e+00 |
| 300 | 2011-03 | 0.103009 | 3.114205e+00 |
| 301 | 2011-04 | 0.105791 | 3.103893e+00 |
| 302 | 2011-05 | 0.107673 | 3.089676e+00 |
| 303 | 2011-06 | 0.110133 | 3.077489e+00 |
| 304 | 2011-07 | 0.111380 | 3.057049e+00 |
| 305 | 2011-08 | 0.112965 | 3.037004e+00 |
| 306 | 2011-09 | 0.114285 | 3.016257e+00 |
| 307 | 2011-10 | 0.115302 | 2.995565e+00 |
| 308 | 2011-11 | 0.115926 | 2.975793e+00 |
| 309 | 2011-12 | 0.116302 | 2.952701e+00 |
| 310 | 2012-01 | 0.116442 | 2.932449e+00 |
| 311 | 2012-02 | 0.115888 | 2.913238e+00 |
| 312 | 2012-03 | 0.114593 | 2.885404e+00 |
| 313 | 2012-04 | 0.112726 | 2.858315e+00 |
| 314 | 2012-05 | 0.110397 | 2.832661e+00 |
| 315 | 2012-06 | 0.107039 | 2.806664e+00 |
| 316 | 2012-07 | 0.104304 | 2.777242e+00 |
| 317 | 2012-08 | 0.100235 | 2.748928e+00 |
| 318 | 2012-09 | 0.096438 | 2.716161e+00 |
| 319 | 2012-10 | 0.092719 | 2.684651e+00 |
| 320 | 2012-11 | 0.089117 | 2.645476e+00 |
| 321 | 2012-12 | 0.085921 | 2.608021e+00 |
| 322 | 2013-01 | 0.081756 | 2.563191e+00 |
| 323 | 2013-02 | 0.078541 | 2.511117e+00 |
| 324 | 2013-03 | 0.076793 | 2.476281e+00 |
| 325 | 2013-04 | 0.074730 | 2.425868e+00 |
| 326 | 2013-05 | 0.073385 | 2.384434e+00 |
| 327 | 2013-06 | 0.072439 | 2.336998e+00 |
| 328 | 2013-07 | 0.072195 | 2.294212e+00 |
| 329 | 2013-08 | 0.072492 | 2.256168e+00 |
| 330 | 2013-09 | 0.073597 | 2.221814e+00 |
| 331 | 2013-10 | 0.075260 | 2.196510e+00 |
| 332 | 2013-11 | 0.077432 | 2.172278e+00 |
| 333 | 2013-12 | 0.079502 | 2.153836e+00 |
| 334 | 2014-01 | 0.081974 | 2.139169e+00 |
| 335 | 2014-02 | 0.085332 | 2.126291e+00 |
| 336 | 2014-03 | 0.087442 | 2.112887e+00 |
| 337 | 2014-04 | 0.090494 | 2.103494e+00 |
| 338 | 2014-05 | 0.092899 | 2.088589e+00 |
| 339 | 2014-06 | 0.095915 | 2.079640e+00 |
| 340 | 2014-07 | 0.098149 | 2.066694e+00 |
| 341 | 2014-08 | 0.100414 | 2.054677e+00 |
| 342 | 2014-09 | 0.102391 | 2.045296e+00 |
| 343 | 2014-10 | 0.104137 | 2.034588e+00 |
| 344 | 2014-11 | 0.105764 | 2.024396e+00 |
| 345 | 2014-12 | 0.107387 | 2.012038e+00 |
| 346 | 2015-01 | 0.108907 | 1.994363e+00 |
| 347 | 2015-02 | 0.109838 | 1.985023e+00 |
| 348 | 2015-03 | 0.111716 | 1.968842e+00 |
| 349 | 2015-04 | 0.112874 | 1.955097e+00 |
| 350 | 2015-05 | 0.114991 | 1.939448e+00 |
| 351 | 2015-06 | 0.116584 | 1.926602e+00 |
| 352 | 2015-07 | 0.119509 | 1.913646e+00 |
| 353 | 2015-08 | 0.122230 | 1.900605e+00 |
| 354 | 2015-09 | 0.124530 | 1.889542e+00 |
| 355 | 2015-10 | 0.126830 | 1.879203e+00 |
| 356 | 2015-11 | 0.128937 | 1.870287e+00 |
| 357 | 2015-12 | 0.131322 | 1.862054e+00 |
| 358 | 2016-01 | 0.133467 | 1.850701e+00 |
| 359 | 2016-02 | 0.134720 | 1.841901e+00 |
| 360 | 2016-03 | 0.136564 | 1.839120e+00 |
| 361 | 2016-04 | 0.137896 | 1.834686e+00 |
| 362 | 2016-05 | 0.139329 | 1.832702e+00 |
| 363 | 2016-06 | 0.140131 | 1.830066e+00 |
| 364 | 2016-07 | 0.140550 | 1.828550e+00 |
| 365 | 2016-08 | 0.140725 | 1.827490e+00 |
| 366 | 2016-09 | 0.140725 | 1.827451e+00 |
| 367 | 2016-10 | 0.140725 | 1.827481e+00 |
| 368 | 2016-11 | 0.139936 | 1.827921e+00 |
| 369 | 2016-12 | 0.139707 | 1.828740e+00 |
| 370 | 2017-01 | 0.140252 | 1.832428e+00 |
| 371 | 2017-02 | 0.140201 | 1.832454e+00 |
| 372 | 2017-03 | 0.137851 | 1.831290e+00 |
| 373 | 2017-04 | 0.136415 | 1.829801e+00 |
| 374 | 2017-05 | 0.133123 | 1.825987e+00 |
| 375 | 2017-06 | 0.130110 | 1.822741e+00 |
| 376 | 2017-07 | 0.126764 | 1.819040e+00 |
| 377 | 2017-08 | 0.122659 | 1.814500e+00 |
| 378 | 2017-09 | 0.118120 | 1.809140e+00 |
| 379 | 2017-10 | 0.113227 | 1.803231e+00 |
| 380 | 2017-11 | 0.108090 | 1.796333e+00 |
| 381 | 2017-12 | 0.102909 | 1.788133e+00 |
| 382 | 2018-01 | 0.096292 | 1.778913e+00 |
| 383 | 2018-02 | 0.090464 | 1.771112e+00 |
| 384 | 2018-03 | 0.087094 | 1.761933e+00 |
| 385 | 2018-04 | 0.082236 | 1.752132e+00 |
| 386 | 2018-05 | 0.078950 | 1.742136e+00 |
| 387 | 2018-06 | 0.075272 | 1.731355e+00 |
| 388 | 2018-07 | 0.072246 | 1.718290e+00 |
| 389 | 2018-08 | 0.069516 | 1.704830e+00 |
| 390 | 2018-09 | 0.067477 | 1.689162e+00 |
| 391 | 2018-10 | 0.066066 | 1.673798e+00 |
| 392 | 2018-11 | 0.065052 | 1.657165e+00 |
| 393 | 2018-12 | 0.064398 | 1.643832e+00 |
| 394 | 2019-01 | 0.063990 | 1.629536e+00 |
| 395 | 2019-02 | 0.064104 | 1.617206e+00 |
| 396 | 2019-03 | 0.063452 | 1.605887e+00 |
| 397 | 2019-04 | 0.063689 | 1.598040e+00 |
| 398 | 2019-05 | 0.063438 | 1.590037e+00 |
| 399 | 2019-06 | 0.063706 | 1.583933e+00 |
| 400 | 2019-07 | 0.063455 | 1.577985e+00 |
| 401 | 2019-08 | 0.063235 | 1.572546e+00 |
| 402 | 2019-09 | 0.062992 | 1.567793e+00 |
| 403 | 2019-10 | 0.062428 | 1.561981e+00 |
| 404 | 2019-11 | 0.061682 | 1.555138e+00 |
| 405 | 2019-12 | 0.060397 | 1.547197e+00 |
| 406 | 2020-01 | 0.058682 | 1.539182e+00 |
| 407 | 2020-02 | 0.057023 | 1.531490e+00 |
| 408 | 2020-03 | 0.055232 | 1.522023e+00 |
| 409 | 2020-04 | 0.052723 | 1.512759e+00 |
| 410 | 2020-05 | 0.050290 | 1.500811e+00 |
| 411 | 2020-06 | 0.047178 | 1.487668e+00 |
| 412 | 2020-07 | 0.043746 | 1.472395e+00 |
| 413 | 2020-08 | 0.040190 | 1.453521e+00 |
| 414 | 2020-09 | 0.036622 | 1.438010e+00 |
| 415 | 2020-10 | 0.033474 | 1.421727e+00 |
| 416 | 2020-11 | 0.030824 | 1.405268e+00 |
| 417 | 2020-12 | 0.028441 | 1.389431e+00 |
| 418 | 2021-01 | 0.026365 | 1.371034e+00 |
| 419 | 2021-02 | 0.024545 | 1.356398e+00 |
| 420 | 2021-03 | 0.022726 | 1.338402e+00 |
| 421 | 2021-04 | 0.021812 | 1.321621e+00 |
| 422 | 2021-05 | 0.021594 | 1.305550e+00 |
| 423 | 2021-06 | 0.022006 | 1.290128e+00 |
| 424 | 2021-07 | 0.023669 | 1.277333e+00 |
| 425 | 2021-08 | 0.025808 | 1.261895e+00 |
| 426 | 2021-09 | 0.028560 | 1.250340e+00 |
| 427 | 2021-10 | 0.031830 | 1.240317e+00 |
| 428 | 2021-11 | 0.035825 | 1.233383e+00 |
| 429 | 2021-12 | 0.041030 | 1.227974e+00 |
| 430 | 2022-01 | 0.047452 | 1.225148e+00 |
| 431 | 2022-02 | 0.053638 | 1.224572e+00 |
| 432 | 2022-03 | 0.060742 | 1.225419e+00 |
| 433 | 2022-04 | 0.068145 | 1.229160e+00 |
| 434 | 2022-05 | 0.075452 | 1.234212e+00 |
| 435 | 2022-06 | 0.083486 | 1.241525e+00 |
| 436 | 2022-07 | 0.090850 | 1.249697e+00 |
| 437 | 2022-08 | 0.098612 | 1.259301e+00 |
| 438 | 2022-09 | 0.106093 | 1.270360e+00 |
| 439 | 2022-10 | 0.112420 | 1.280962e+00 |
| 440 | 2022-11 | 0.117685 | 1.292253e+00 |
| 441 | 2022-12 | 0.122409 | 1.303498e+00 |
| 442 | 2023-01 | 0.126375 | 1.316803e+00 |
| 443 | 2023-02 | 0.129320 | 1.329253e+00 |
| 444 | 2023-03 | 0.131994 | 1.339958e+00 |
| 445 | 2023-04 | 0.133431 | 1.351029e+00 |
| 446 | 2023-05 | 0.134392 | 1.361494e+00 |
| 447 | 2023-06 | 0.135247 | 1.372511e+00 |
| 448 | 2023-07 | 0.135665 | 1.382955e+00 |
| 449 | 2023-08 | 0.135724 | 1.392974e+00 |
| 450 | 2023-09 | 0.135297 | 1.400532e+00 |
| 451 | 2023-10 | 0.134531 | 1.406258e+00 |
| 452 | 2023-11 | 0.133525 | 1.411175e+00 |
| 453 | 2023-12 | 0.132300 | 1.415423e+00 |
| 454 | 2024-01 | 0.129479 | 1.418554e+00 |
| 455 | 2024-02 | 0.127150 | 1.419539e+00 |
| 456 | 2024-03 | 0.125708 | 1.421993e+00 |
| 457 | 2024-04 | 0.123319 | 1.421518e+00 |
| 458 | 2024-05 | 0.121285 | 1.422797e+00 |
# validação dos dados
filtro_cdi_inferior = cdi_consolidado['ano-mês'] >= '2014-01-01'
filtro_cdi_superior = cdi_consolidado['ano-mês'] <= '2022-12-31'
fig = px.line(cdi_consolidado[filtro_cdi_inferior & filtro_cdi_superior],
x='ano-mês',
y='cdi_acum_365d',
title='retorno cdi (% ano ano)',
markers=True)
fig.show()

dolar.head(3)
| data | valor | |
|---|---|---|
| 0 | 1984-11-28 | 2828.0 |
| 1 | 1984-11-29 | 2828.0 |
| 2 | 1984-11-30 | 2881.0 |
# check de sanidade de dados duplicados
print(dolar['data'].shape[0], dolar.drop_duplicates(subset=['data']).shape[0])
9897 9897
# cria coluna ano-mês
dolar['ano-mês'] = dolar['data'].dt.to_period('M')
# converte para string para plot
dolar['ano-mês'] = dolar['ano-mês'].astype(str)
dolar_consolidado = (
dolar
.groupby('ano-mês')
.agg(
dolar = ('valor', 'median')
)
.reset_index()
.sort_values(by=['ano-mês'], ascending=True)
)
dolar_consolidado
| ano-mês | dolar | |
|---|---|---|
| 0 | 1984-11 | 2828.00000 |
| 1 | 1984-12 | 3008.00000 |
| 2 | 1985-01 | 3393.00000 |
| 3 | 1985-02 | 3765.50000 |
| 4 | 1985-03 | 4161.00000 |
| 5 | 1985-04 | 4720.00000 |
| 6 | 1985-05 | 5230.00000 |
| 7 | 1985-06 | 5725.00000 |
| 8 | 1985-07 | 6220.00000 |
| 9 | 1985-08 | 6710.00000 |
| 10 | 1985-09 | 7490.00000 |
| 11 | 1985-10 | 8170.00000 |
| 12 | 1985-11 | 8892.50000 |
| 13 | 1985-12 | 9915.00000 |
| 14 | 1986-01 | 11280.00000 |
| 15 | 1986-02 | 13065.00000 |
| 16 | 1986-03 | 13.84000 |
| 17 | 1986-04 | 13.84000 |
| 18 | 1986-05 | 13.84000 |
| 19 | 1986-06 | 13.84000 |
| 20 | 1986-07 | 13.84000 |
| 21 | 1986-08 | 13.84000 |
| 22 | 1986-09 | 13.84000 |
| 23 | 1986-10 | 14.09000 |
| 24 | 1986-11 | 14.09000 |
| 25 | 1986-12 | 14.55950 |
| 26 | 1987-01 | 15.66800 |
| 27 | 1987-02 | 18.07650 |
| 28 | 1987-03 | 20.98650 |
| 29 | 1987-04 | 23.64000 |
| 30 | 1987-05 | 31.01250 |
| 31 | 1987-06 | 39.90650 |
| 32 | 1987-07 | 45.02900 |
| 33 | 1987-08 | 47.04800 |
| 34 | 1987-09 | 49.85700 |
| 35 | 1987-10 | 53.22700 |
| 36 | 1987-11 | 59.13500 |
| 37 | 1987-12 | 67.62050 |
| 38 | 1988-01 | 77.56700 |
| 39 | 1988-02 | 90.53800 |
| 40 | 1988-03 | 107.15000 |
| 41 | 1988-04 | 125.15000 |
| 42 | 1988-05 | 150.54500 |
| 43 | 1988-06 | 177.74000 |
| 44 | 1988-07 | 213.91000 |
| 45 | 1988-08 | 267.14000 |
| 46 | 1988-09 | 324.78000 |
| 47 | 1988-10 | 409.24000 |
| 48 | 1988-11 | 525.47000 |
| 49 | 1988-12 | 665.16500 |
| 50 | 1989-01 | 1.00000 |
| 51 | 1989-02 | 1.00000 |
| 52 | 1989-03 | 1.00000 |
| 53 | 1989-04 | 1.00000 |
| 54 | 1989-05 | 1.12200 |
| 55 | 1989-06 | 1.35400 |
| 56 | 1989-07 | 1.90500 |
| 57 | 1989-08 | 2.46400 |
| 58 | 1989-09 | 3.24300 |
| 59 | 1989-10 | 4.46500 |
| 60 | 1989-11 | 6.20250 |
| 61 | 1989-12 | 9.07750 |
| 62 | 1990-01 | 14.12750 |
| 63 | 1990-02 | 23.20050 |
| 64 | 1990-03 | 38.43500 |
| 65 | 1990-04 | 51.15400 |
| 66 | 1990-05 | 51.28450 |
| 67 | 1990-06 | 56.13650 |
| 68 | 1990-07 | 66.57300 |
| 69 | 1990-08 | 71.71700 |
| 70 | 1990-09 | 75.21800 |
| 71 | 1990-10 | 94.17900 |
| 72 | 1990-11 | 118.48500 |
| 73 | 1990-12 | 151.68000 |
| 74 | 1991-01 | 196.27000 |
| 75 | 1991-02 | 221.56000 |
| 76 | 1991-03 | 229.15000 |
| 77 | 1991-04 | 252.10000 |
| 78 | 1991-05 | 273.96000 |
| 79 | 1991-06 | 297.01000 |
| 80 | 1991-07 | 328.41000 |
| 81 | 1991-08 | 371.18000 |
| 82 | 1991-09 | 429.00000 |
| 83 | 1991-10 | 581.77000 |
| 84 | 1991-11 | 736.85500 |
| 85 | 1991-12 | 956.45000 |
| 86 | 1992-01 | 1201.92500 |
| 87 | 1992-02 | 1475.45000 |
| 88 | 1992-03 | 1813.12500 |
| 89 | 1992-04 | 2196.00000 |
| 90 | 1992-05 | 2624.05000 |
| 91 | 1992-06 | 3144.10000 |
| 92 | 1992-07 | 3822.90000 |
| 93 | 1992-08 | 4664.45000 |
| 94 | 1992-09 | 5758.40000 |
| 95 | 1992-10 | 7194.40000 |
| 96 | 1992-11 | 9020.25000 |
| 97 | 1992-12 | 11120.72500 |
| 98 | 1993-01 | 14080.75000 |
| 99 | 1993-02 | 18040.52500 |
| 100 | 1993-03 | 22405.00000 |
| 101 | 1993-04 | 28653.10000 |
| 102 | 1993-05 | 36888.40000 |
| 103 | 1993-06 | 48020.00000 |
| 104 | 1993-07 | 62517.50000 |
| 105 | 1993-08 | 82.41900 |
| 106 | 1993-09 | 110.50500 |
| 107 | 1993-10 | 150.43000 |
| 108 | 1993-11 | 204.37500 |
| 109 | 1993-12 | 277.73500 |
| 110 | 1994-01 | 387.57000 |
| 111 | 1994-02 | 547.62350 |
| 112 | 1994-03 | 761.41950 |
| 113 | 1994-04 | 1104.88000 |
| 114 | 1994-05 | 1573.34000 |
| 115 | 1994-06 | 2276.43000 |
| 116 | 1994-07 | 0.93400 |
| 117 | 1994-08 | 0.89600 |
| 118 | 1994-09 | 0.86000 |
| 119 | 1994-10 | 0.84700 |
| 120 | 1994-11 | 0.83900 |
| 121 | 1994-12 | 0.84850 |
| 122 | 1995-01 | 0.84600 |
| 123 | 1995-02 | 0.84000 |
| 124 | 1995-03 | 0.89000 |
| 125 | 1995-04 | 0.90500 |
| 126 | 1995-05 | 0.89650 |
| 127 | 1995-06 | 0.91400 |
| 128 | 1995-07 | 0.92800 |
| 129 | 1995-08 | 0.94200 |
| 130 | 1995-09 | 0.95300 |
| 131 | 1995-10 | 0.95900 |
| 132 | 1995-11 | 0.96280 |
| 133 | 1995-12 | 0.96745 |
| 134 | 1996-01 | 0.97295 |
| 135 | 1996-02 | 0.98130 |
| 136 | 1996-03 | 0.98680 |
| 137 | 1996-04 | 0.99040 |
| 138 | 1996-05 | 0.99580 |
| 139 | 1996-06 | 1.00160 |
| 140 | 1996-07 | 1.00650 |
| 141 | 1996-08 | 1.01325 |
| 142 | 1996-09 | 1.01960 |
| 143 | 1996-10 | 1.02525 |
| 144 | 1996-11 | 1.03065 |
| 145 | 1996-12 | 1.03830 |
| 146 | 1997-01 | 1.04335 |
| 147 | 1997-02 | 1.04950 |
| 148 | 1997-03 | 1.05570 |
| 149 | 1997-04 | 1.06060 |
| 150 | 1997-05 | 1.06800 |
| 151 | 1997-06 | 1.07410 |
| 152 | 1997-07 | 1.08110 |
| 153 | 1997-08 | 1.08730 |
| 154 | 1997-09 | 1.09305 |
| 155 | 1997-10 | 1.09960 |
| 156 | 1997-11 | 1.10755 |
| 157 | 1997-12 | 1.11435 |
| 158 | 1998-01 | 1.12050 |
| 159 | 1998-02 | 1.12710 |
| 160 | 1998-03 | 1.13350 |
| 161 | 1998-04 | 1.14090 |
| 162 | 1998-05 | 1.14745 |
| 163 | 1998-06 | 1.15530 |
| 164 | 1998-07 | 1.16170 |
| 165 | 1998-08 | 1.17280 |
| 166 | 1998-09 | 1.18010 |
| 167 | 1998-10 | 1.18880 |
| 168 | 1998-11 | 1.19155 |
| 169 | 1998-12 | 1.20525 |
| 170 | 1999-01 | 1.50215 |
| 171 | 1999-02 | 1.91040 |
| 172 | 1999-03 | 1.86310 |
| 173 | 1999-04 | 1.69780 |
| 174 | 1999-05 | 1.67340 |
| 175 | 1999-06 | 1.76720 |
| 176 | 1999-07 | 1.80130 |
| 177 | 1999-08 | 1.87485 |
| 178 | 1999-09 | 1.89230 |
| 179 | 1999-10 | 1.97125 |
| 180 | 1999-11 | 1.92975 |
| 181 | 1999-12 | 1.84070 |
| 182 | 2000-01 | 1.79970 |
| 183 | 2000-02 | 1.77410 |
| 184 | 2000-03 | 1.73880 |
| 185 | 2000-04 | 1.76620 |
| 186 | 2000-05 | 1.82790 |
| 187 | 2000-06 | 1.80790 |
| 188 | 2000-07 | 1.79720 |
| 189 | 2000-08 | 1.80790 |
| 190 | 2000-09 | 1.84285 |
| 191 | 2000-10 | 1.87140 |
| 192 | 2000-11 | 1.95315 |
| 193 | 2000-12 | 1.96290 |
| 194 | 2001-01 | 1.95200 |
| 195 | 2001-02 | 1.99520 |
| 196 | 2001-03 | 2.08965 |
| 197 | 2001-04 | 2.17875 |
| 198 | 2001-05 | 2.30620 |
| 199 | 2001-06 | 2.38270 |
| 200 | 2001-07 | 2.47490 |
| 201 | 2001-08 | 2.51400 |
| 202 | 2001-09 | 2.67930 |
| 203 | 2001-10 | 2.73755 |
| 204 | 2001-11 | 2.53485 |
| 205 | 2001-12 | 2.34905 |
| 206 | 2002-01 | 2.37990 |
| 207 | 2002-02 | 2.42365 |
| 208 | 2002-03 | 2.34810 |
| 209 | 2002-04 | 2.31760 |
| 210 | 2002-05 | 2.48380 |
| 211 | 2002-06 | 2.69760 |
| 212 | 2002-07 | 2.87460 |
| 213 | 2002-08 | 3.10575 |
| 214 | 2002-09 | 3.18840 |
| 215 | 2002-10 | 3.85200 |
| 216 | 2002-11 | 3.57485 |
| 217 | 2002-12 | 3.61600 |
| 218 | 2003-01 | 3.42525 |
| 219 | 2003-02 | 3.59120 |
| 220 | 2003-03 | 3.44420 |
| 221 | 2003-04 | 3.14015 |
| 222 | 2003-05 | 2.96390 |
| 223 | 2003-06 | 2.87320 |
| 224 | 2003-07 | 2.88230 |
| 225 | 2003-08 | 2.99730 |
| 226 | 2003-09 | 2.91855 |
| 227 | 2003-10 | 2.86350 |
| 228 | 2003-11 | 2.92580 |
| 229 | 2003-12 | 2.93180 |
| 230 | 2004-01 | 2.84310 |
| 231 | 2004-02 | 2.93110 |
| 232 | 2004-03 | 2.90700 |
| 233 | 2004-04 | 2.90745 |
| 234 | 2004-05 | 3.12110 |
| 235 | 2004-06 | 3.12980 |
| 236 | 2004-07 | 3.03830 |
| 237 | 2004-08 | 3.00675 |
| 238 | 2004-09 | 2.88920 |
| 239 | 2004-10 | 2.85410 |
| 240 | 2004-11 | 2.77670 |
| 241 | 2004-12 | 2.71450 |
| 242 | 2005-01 | 2.70070 |
| 243 | 2005-02 | 2.59900 |
| 244 | 2005-03 | 2.70865 |
| 245 | 2005-04 | 2.58040 |
| 246 | 2005-05 | 2.46360 |
| 247 | 2005-06 | 2.40950 |
| 248 | 2005-07 | 2.36680 |
| 249 | 2005-08 | 2.36370 |
| 250 | 2005-09 | 2.29480 |
| 251 | 2005-10 | 2.25445 |
| 252 | 2005-11 | 2.20820 |
| 253 | 2005-12 | 2.30625 |
| 254 | 2006-01 | 2.27380 |
| 255 | 2006-02 | 2.15295 |
| 256 | 2006-03 | 2.15060 |
| 257 | 2006-04 | 2.12960 |
| 258 | 2006-05 | 2.18000 |
| 259 | 2006-06 | 2.25060 |
| 260 | 2006-07 | 2.18990 |
| 261 | 2006-08 | 2.15230 |
| 262 | 2006-09 | 2.16950 |
| 263 | 2006-10 | 2.14570 |
| 264 | 2006-11 | 2.16065 |
| 265 | 2006-12 | 2.14755 |
| 266 | 2007-01 | 2.13640 |
| 267 | 2007-02 | 2.09575 |
| 268 | 2007-03 | 2.09055 |
| 269 | 2007-04 | 2.03270 |
| 270 | 2007-05 | 1.96415 |
| 271 | 2007-06 | 1.93185 |
| 272 | 2007-07 | 1.87925 |
| 273 | 2007-08 | 1.97770 |
| 274 | 2007-09 | 1.89910 |
| 275 | 2007-10 | 1.80745 |
| 276 | 2007-11 | 1.76645 |
| 277 | 2007-12 | 1.78805 |
| 278 | 2008-01 | 1.76890 |
| 279 | 2008-02 | 1.73940 |
| 280 | 2008-03 | 1.70015 |
| 281 | 2008-04 | 1.68670 |
| 282 | 2008-05 | 1.65920 |
| 283 | 2008-06 | 1.62150 |
| 284 | 2008-07 | 1.59380 |
| 285 | 2008-08 | 1.62070 |
| 286 | 2008-09 | 1.81835 |
| 287 | 2008-10 | 2.17000 |
| 288 | 2008-11 | 2.28700 |
| 289 | 2008-12 | 2.37670 |
| 290 | 2009-01 | 2.31490 |
| 291 | 2009-02 | 2.30980 |
| 292 | 2009-03 | 2.30820 |
| 293 | 2009-04 | 2.20255 |
| 294 | 2009-05 | 2.06140 |
| 295 | 2009-06 | 1.95160 |
| 296 | 2009-07 | 1.93400 |
| 297 | 2009-08 | 1.84120 |
| 298 | 2009-09 | 1.80940 |
| 299 | 2009-10 | 1.74120 |
| 300 | 2009-11 | 1.72605 |
| 301 | 2009-12 | 1.75005 |
| 302 | 2010-01 | 1.77160 |
| 303 | 2010-02 | 1.83635 |
| 304 | 2010-03 | 1.78480 |
| 305 | 2010-04 | 1.75860 |
| 306 | 2010-05 | 1.81670 |
| 307 | 2010-06 | 1.80150 |
| 308 | 2010-07 | 1.76615 |
| 309 | 2010-08 | 1.75855 |
| 310 | 2010-09 | 1.71840 |
| 311 | 2010-10 | 1.68100 |
| 312 | 2010-11 | 1.71835 |
| 313 | 2010-12 | 1.69490 |
| 314 | 2011-01 | 1.67340 |
| 315 | 2011-02 | 1.66795 |
| 316 | 2011-03 | 1.66120 |
| 317 | 2011-04 | 1.58420 |
| 318 | 2011-05 | 1.61735 |
| 319 | 2011-06 | 1.58770 |
| 320 | 2011-07 | 1.56390 |
| 321 | 2011-08 | 1.59740 |
| 322 | 2011-09 | 1.72880 |
| 323 | 2011-10 | 1.76320 |
| 324 | 2011-11 | 1.77475 |
| 325 | 2011-12 | 1.85320 |
| 326 | 2012-01 | 1.78135 |
| 327 | 2012-02 | 1.71730 |
| 328 | 2012-03 | 1.81185 |
| 329 | 2012-04 | 1.84135 |
| 330 | 2012-05 | 1.99455 |
| 331 | 2012-06 | 2.04415 |
| 332 | 2012-07 | 2.03125 |
| 333 | 2012-08 | 2.02660 |
| 334 | 2012-09 | 2.02730 |
| 335 | 2012-10 | 2.02905 |
| 336 | 2012-11 | 2.07285 |
| 337 | 2012-12 | 2.07960 |
| 338 | 2013-01 | 2.03660 |
| 339 | 2013-02 | 1.97125 |
| 340 | 2013-03 | 1.98285 |
| 341 | 2013-04 | 2.00260 |
| 342 | 2013-05 | 2.02540 |
| 343 | 2013-06 | 2.15295 |
| 344 | 2013-07 | 2.25480 |
| 345 | 2013-08 | 2.34745 |
| 346 | 2013-09 | 2.26490 |
| 347 | 2013-10 | 2.18480 |
| 348 | 2013-11 | 2.29765 |
| 349 | 2013-12 | 2.34490 |
| 350 | 2014-01 | 2.37700 |
| 351 | 2014-02 | 2.39300 |
| 352 | 2014-03 | 2.33380 |
| 353 | 2014-04 | 2.23340 |
| 354 | 2014-05 | 2.21870 |
| 355 | 2014-06 | 2.23245 |
| 356 | 2014-07 | 2.22040 |
| 357 | 2014-08 | 2.26920 |
| 358 | 2014-09 | 2.33675 |
| 359 | 2014-10 | 2.44770 |
| 360 | 2014-11 | 2.54205 |
| 361 | 2014-12 | 2.65425 |
| 362 | 2015-01 | 2.62430 |
| 363 | 2015-02 | 2.84875 |
| 364 | 2015-03 | 3.16380 |
| 365 | 2015-04 | 3.05085 |
| 366 | 2015-05 | 3.04045 |
| 367 | 2015-06 | 3.10420 |
| 368 | 2015-07 | 3.18970 |
| 369 | 2015-08 | 3.49090 |
| 370 | 2015-09 | 3.86980 |
| 371 | 2015-10 | 3.86560 |
| 372 | 2015-11 | 3.79070 |
| 373 | 2015-12 | 3.88370 |
| 374 | 2016-01 | 4.03945 |
| 375 | 2016-02 | 3.97960 |
| 376 | 2016-03 | 3.66935 |
| 377 | 2016-04 | 3.54875 |
| 378 | 2016-05 | 3.53870 |
| 379 | 2016-06 | 3.40975 |
| 380 | 2016-07 | 3.27900 |
| 381 | 2016-08 | 3.21830 |
| 382 | 2016-09 | 3.24720 |
| 383 | 2016-10 | 3.18690 |
| 384 | 2016-11 | 3.39220 |
| 385 | 2016-12 | 3.36415 |
| 386 | 2017-01 | 3.20455 |
| 387 | 2017-02 | 3.10795 |
| 388 | 2017-03 | 3.12480 |
| 389 | 2017-04 | 3.12980 |
| 390 | 2017-05 | 3.18975 |
| 391 | 2017-06 | 3.29750 |
| 392 | 2017-07 | 3.18210 |
| 393 | 2017-08 | 3.15390 |
| 394 | 2017-09 | 3.13280 |
| 395 | 2017-10 | 3.17320 |
| 396 | 2017-11 | 3.26195 |
| 397 | 2017-12 | 3.29700 |
| 398 | 2018-01 | 3.22080 |
| 399 | 2018-02 | 3.24330 |
| 400 | 2018-03 | 3.28590 |
| 401 | 2018-04 | 3.40520 |
| 402 | 2018-05 | 3.65020 |
| 403 | 2018-06 | 3.77210 |
| 404 | 2018-07 | 3.85190 |
| 405 | 2018-08 | 3.91340 |
| 406 | 2018-09 | 4.12860 |
| 407 | 2018-10 | 3.71285 |
| 408 | 2018-11 | 3.76920 |
| 409 | 2018-12 | 3.88810 |
| 410 | 2019-01 | 3.74280 |
| 411 | 2019-02 | 3.72810 |
| 412 | 2019-03 | 3.83440 |
| 413 | 2019-04 | 3.87300 |
| 414 | 2019-05 | 3.99275 |
| 415 | 2019-06 | 3.86110 |
| 416 | 2019-07 | 3.76970 |
| 417 | 2019-08 | 4.01310 |
| 418 | 2019-09 | 4.12490 |
| 419 | 2019-10 | 4.09540 |
| 420 | 2019-11 | 4.18290 |
| 421 | 2019-12 | 4.08130 |
| 422 | 2020-01 | 4.16940 |
| 423 | 2020-02 | 4.32805 |
| 424 | 2020-03 | 4.97405 |
| 425 | 2020-04 | 5.26150 |
| 426 | 2020-05 | 5.68220 |
| 427 | 2020-06 | 5.22260 |
| 428 | 2020-07 | 5.30850 |
| 429 | 2020-08 | 5.45510 |
| 430 | 2020-09 | 5.36980 |
| 431 | 2020-10 | 5.61720 |
| 432 | 2020-11 | 5.38980 |
| 433 | 2020-12 | 5.15225 |
| 434 | 2021-01 | 5.33510 |
| 435 | 2021-02 | 5.40810 |
| 436 | 2021-03 | 5.65790 |
| 437 | 2021-04 | 5.58405 |
| 438 | 2021-05 | 5.28220 |
| 439 | 2021-06 | 5.03730 |
| 440 | 2021-07 | 5.16850 |
| 441 | 2021-08 | 5.24465 |
| 442 | 2021-09 | 5.27830 |
| 443 | 2021-10 | 5.53320 |
| 444 | 2021-11 | 5.56835 |
| 445 | 2021-12 | 5.64610 |
| 446 | 2022-01 | 5.52130 |
| 447 | 2022-02 | 5.19870 |
| 448 | 2022-03 | 5.03330 |
| 449 | 2022-04 | 4.70250 |
| 450 | 2022-05 | 4.98635 |
| 451 | 2022-06 | 5.12030 |
| 452 | 2022-07 | 5.38990 |
| 453 | 2022-08 | 5.12470 |
| 454 | 2022-09 | 5.21550 |
| 455 | 2022-10 | 5.26335 |
| 456 | 2022-11 | 5.30700 |
| 457 | 2022-12 | 5.23960 |
| 458 | 2023-01 | 5.18090 |
| 459 | 2023-02 | 5.18125 |
| 460 | 2023-03 | 5.20800 |
| 461 | 2023-04 | 5.04570 |
| 462 | 2023-05 | 4.96960 |
| 463 | 2023-06 | 4.84620 |
| 464 | 2023-07 | 4.80000 |
| 465 | 2023-08 | 4.89770 |
| 466 | 2023-09 | 4.93420 |
| 467 | 2023-10 | 5.05680 |
| 468 | 2023-11 | 4.89290 |
| 469 | 2023-12 | 4.89900 |
| 470 | 2024-01 | 4.91900 |
| 471 | 2024-02 | 4.96870 |
| 472 | 2024-03 | 4.98100 |
| 473 | 2024-04 | 5.12740 |
| 474 | 2024-05 | 5.14120 |
# validação dos dados
filtro_dolar_inferior = dolar_consolidado['ano-mês'] >= '1994-07-01'
filtro_dolar_superior = dolar_consolidado['ano-mês'] <= '2022-11-01'
fig = px.line(dolar_consolidado[filtro_dolar_inferior & filtro_dolar_superior],
x='ano-mês',
y='dolar',
title='cotação do dólar em R$',
markers=True)
fig.show()

ibovespa.head(3)
| Date | Open | High | Low | Close | Adj Close | Volume | data | |
|---|---|---|---|---|---|---|---|---|
| 0 | 1993-04-27 | 24.799999 | 25.400000 | 24.500000 | 24.500000 | 24.500000 | 0 | 1993-04-27 |
| 1 | 1993-04-28 | 24.500000 | 24.600000 | 23.700001 | 24.299999 | 24.299999 | 0 | 1993-04-28 |
| 2 | 1993-04-29 | 24.299999 | 24.799999 | 23.700001 | 23.700001 | 23.700001 | 0 | 1993-04-29 |
# check de sanidade de dados duplicados
print(ibovespa['data'].shape[0], ibovespa.drop_duplicates(subset=['data']).shape[0])
7676 7676
# cria coluna ano-mês
ibovespa['ano-mês'] = ibovespa['data'].dt.to_period('M')
# converte para string para plot
ibovespa['ano-mês'] = ibovespa['ano-mês'].astype(str)
ibovespa_consolidado = (
ibovespa
.groupby('ano-mês')
.agg(
ibovespa = ('Adj Close', 'median')
)
.reset_index()
.sort_values(by=['ano-mês'], ascending=True)
)
ibovespa_consolidado.shape
(373, 2)
# validação dos dados
filtro_ibovespa_inferior = ibovespa_consolidado['ano-mês'] >= '2019-01-01'
filtro_ibovespa_superior = ibovespa_consolidado['ano-mês'] <= '2024-05-30'
fig = px.line(ibovespa_consolidado[filtro_ibovespa_inferior & filtro_ibovespa_superior],
x='ano-mês',
y='ibovespa',
title='indíce ibovespa',
markers=True)
fig.show()

sp500.head(3)
| Date | Open | High | Low | Close | Adj Close | Volume | data | |
|---|---|---|---|---|---|---|---|---|
| 0 | 1990-01-02 | 353.399994 | 359.690002 | 351.980011 | 359.690002 | 359.690002 | 162070000 | 1990-01-02 |
| 1 | 1990-01-03 | 359.690002 | 360.589996 | 357.890015 | 358.760010 | 358.760010 | 192330000 | 1990-01-03 |
| 2 | 1990-01-04 | 358.760010 | 358.760010 | 352.890015 | 355.670013 | 355.670013 | 177000000 | 1990-01-04 |
# check de sanidade de dados duplicados
print(sp500['data'].shape[0], sp500.drop_duplicates(subset=['data']).shape[0])
8648 8648
# cria coluna ano-mês
sp500['ano-mês'] = sp500['data'].dt.to_period('M')
# converte para string para plot
sp500['ano-mês'] = sp500['ano-mês'].astype(str)
sp500_consolidado = (
sp500
.groupby('ano-mês')
.agg(
sp500 = ('Adj Close', 'median')
)
.reset_index()
.sort_values(by=['ano-mês'], ascending=True)
)
sp500_consolidado.shape
(412, 2)
# validação dos dados
filtro_sp500_inferior = sp500_consolidado['ano-mês'] >= '2019-05-19'
filtro_sp500_superior = sp500_consolidado['ano-mês'] <= '2024-05-30'
fig = px.line(sp500_consolidado[filtro_sp500_inferior & filtro_sp500_superior],
x='ano-mês',
y='sp500',
title='indíce sp500',
markers=True)
fig.show()

nasdaq.head(3)
| Date | Open | High | Low | Close | Adj Close | Volume | data | |
|---|---|---|---|---|---|---|---|---|
| 0 | 1990-01-02 | 452.899994 | 459.299988 | 452.700012 | 459.299988 | 459.299988 | 110720000 | 1990-01-02 |
| 1 | 1990-01-03 | 461.100006 | 461.600006 | 460.000000 | 460.899994 | 460.899994 | 152660000 | 1990-01-03 |
| 2 | 1990-01-04 | 460.399994 | 460.799988 | 456.899994 | 459.399994 | 459.399994 | 147950000 | 1990-01-04 |
# check de sanidade de dados duplicados
print(nasdaq['data'].shape[0], nasdaq.drop_duplicates(subset=['data']).shape[0])
8648 8648
# cria coluna ano-mês
nasdaq['ano-mês'] = nasdaq['data'].dt.to_period('M')
# converte para string para plot
nasdaq['ano-mês'] = nasdaq['ano-mês'].astype(str)
nasdaq_consolidado = (
nasdaq
.groupby('ano-mês')
.agg(
nasdaq = ('Adj Close', 'median')
)
.reset_index()
.sort_values(by=['ano-mês'], ascending=True)
)
nasdaq_consolidado.shape
(412, 2)
# validação dos dados
filtro_nasdaq_inferior = nasdaq_consolidado['ano-mês'] >= '2019-05-19'
filtro_nasdaq_superior = nasdaq_consolidado['ano-mês'] <= '2024-05-30'
fig = px.line(nasdaq_consolidado[filtro_nasdaq_inferior & filtro_nasdaq_superior],
x='ano-mês',
y='nasdaq',
title='indíce nasdaq',
markers=True)
fig.show()

ouro.head(3)
| Date | Open | High | Low | Close | Adj Close | Volume | data | |
|---|---|---|---|---|---|---|---|---|
| 0 | 2000-08-30 | 273.899994 | 273.899994 | 273.899994 | 273.899994 | 273.899994 | 0 | 2000-08-30 |
| 1 | 2000-08-31 | 274.799988 | 278.299988 | 274.799988 | 278.299988 | 278.299988 | 0 | 2000-08-31 |
| 2 | 2000-09-01 | 277.000000 | 277.000000 | 277.000000 | 277.000000 | 277.000000 | 0 | 2000-09-01 |
# check de sanidade de dados duplicados
print(ouro['data'].shape[0], ouro.drop_duplicates(subset=['data']).shape[0])
5938 5938
# cria coluna ano-mês
ouro['ano-mês'] = ouro['data'].dt.to_period('M')
# converte para string para plot
ouro['ano-mês'] = ouro['ano-mês'].astype(str)
ouro_consolidado = (
ouro
.groupby('ano-mês')
.agg(
ouro = ('Adj Close', 'median')
)
.reset_index()
.sort_values(by=['ano-mês'], ascending=True)
)
ouro_consolidado.shape
(285, 2)
# validação dos dados
filtro_ouro_inferior = ouro_consolidado['ano-mês'] >= '2013-05-19'
filtro_ouro_superior = ouro_consolidado['ano-mês'] <= '2023-05-30'
fig = px.line(ouro_consolidado[filtro_ouro_inferior & filtro_ouro_superior],
x='ano-mês',
y='ouro',
title='indíce ouro',
markers=True)
fig.show()

Vamos analisar o período de 2010 a 2024. Como queremos a performance em relação aos últimos 10 anos devemos, portanto, filtrar os dados de 2000 até 2024
lista_de_dataframes = {
'ipca' : ipca_consolidado,
'selic': selic_consolidado,
'cdi': cdi_consolidado,
'dolar': dolar_consolidado,
'ibovespa': ibovespa_consolidado,
'sp500': sp500_consolidado,
'nasdaq': nasdaq_consolidado,
'ouro': ouro_consolidado
}
for df in lista_de_dataframes.values():
print(df.shape[0])
532 304 459 475 373 412 412 285
data_inicial = '2000-08'
data_final = '2024-03'
lista_de_dataframes_filtrados = []
for df in lista_de_dataframes.values():
filtro = (df['ano-mês'] >= data_inicial) & (df['ano-mês'] <= data_final)
df = df[filtro].reset_index(drop=True)
lista_de_dataframes_filtrados.append(df)
lista_de_dataframes_filtrados = {
'ipca' : lista_de_dataframes_filtrados[0],
'selic': lista_de_dataframes_filtrados[1],
'cdi': lista_de_dataframes_filtrados[2],
'dolar': lista_de_dataframes_filtrados[3],
'ibovespa': lista_de_dataframes_filtrados[4],
'sp500': lista_de_dataframes_filtrados[5],
'nasdaq': lista_de_dataframes_filtrados[6],
'ouro': lista_de_dataframes_filtrados[7]
}
for ativo, df in lista_de_dataframes_filtrados.items():
print('-'*20 + ativo + '-'*20)
print(f'quantidade de registros de {ativo}: {df.shape[0]}')
print(f'data mínima:', df['ano-mês'].min())
print(f'data máxima:' , df['ano-mês'].max())
print('colunas:', df.columns)
display(df.tail(3))
--------------------ipca-------------------- quantidade de registros de ipca: 284 data mínima: 2000-08 data máxima: 2024-03 colunas: Index(['ipca', 'ano-mês', 'ipca_acum_12m', 'ipca_acum_10y'], dtype='object')
| ipca | ano-mês | ipca_acum_12m | ipca_acum_10y | |
|---|---|---|---|---|
| 281 | 0.42 | 2024-01 | 4.53 | 57.63 |
| 282 | 0.83 | 2024-02 | 4.42 | 57.50 |
| 283 | 0.16 | 2024-03 | 4.41 | 57.64 |
--------------------selic-------------------- quantidade de registros de selic: 284 data mínima: 2000-08 data máxima: 2024-03 colunas: Index(['ano-mês', 'selic'], dtype='object')
| ano-mês | selic | |
|---|---|---|
| 281 | 2024-01 | 11.75 |
| 282 | 2024-02 | 11.25 |
| 283 | 2024-03 | 11.25 |
--------------------cdi-------------------- quantidade de registros de cdi: 284 data mínima: 2000-08 data máxima: 2024-03 colunas: Index(['ano-mês', 'cdi_acum_365d', 'cdi_acum_3650d'], dtype='object')
| ano-mês | cdi_acum_365d | cdi_acum_3650d | |
|---|---|---|---|
| 281 | 2024-01 | 0.129479 | 1.418554 |
| 282 | 2024-02 | 0.127150 | 1.419539 |
| 283 | 2024-03 | 0.125708 | 1.421993 |
--------------------dolar-------------------- quantidade de registros de dolar: 284 data mínima: 2000-08 data máxima: 2024-03 colunas: Index(['ano-mês', 'dolar'], dtype='object')
| ano-mês | dolar | |
|---|---|---|
| 281 | 2024-01 | 4.9190 |
| 282 | 2024-02 | 4.9687 |
| 283 | 2024-03 | 4.9810 |
--------------------ibovespa-------------------- quantidade de registros de ibovespa: 284 data mínima: 2000-08 data máxima: 2024-03 colunas: Index(['ano-mês', 'ibovespa'], dtype='object')
| ano-mês | ibovespa | |
|---|---|---|
| 281 | 2024-01 | 129130.5 |
| 282 | 2024-02 | 129036.0 |
| 283 | 2024-03 | 127690.5 |
--------------------sp500-------------------- quantidade de registros de sp500: 284 data mínima: 2000-08 data máxima: 2024-03 colunas: Index(['ano-mês', 'sp500'], dtype='object')
| ano-mês | sp500 | |
|---|---|---|
| 281 | 2024-01 | 4783.450195 |
| 282 | 2024-02 | 5003.094971 |
| 283 | 2024-03 | 5161.334961 |
--------------------nasdaq-------------------- quantidade de registros de nasdaq: 284 data mínima: 2000-08 data máxima: 2024-03 colunas: Index(['ano-mês', 'nasdaq'], dtype='object')
| ano-mês | nasdaq | |
|---|---|---|
| 281 | 2024-01 | 14972.759766 |
| 282 | 2024-02 | 15826.430176 |
| 283 | 2024-03 | 16236.574707 |
--------------------ouro-------------------- quantidade de registros de ouro: 284 data mínima: 2000-08 data máxima: 2024-03 colunas: Index(['ano-mês', 'ouro'], dtype='object')
| ano-mês | ouro | |
|---|---|---|
| 281 | 2024-01 | 2026.000000 |
| 282 | 2024-02 | 2028.000000 |
| 283 | 2024-03 | 2160.549927 |
O volume de dados está bem preenchido, exceto para Ouro que não temos dados de Jan/2000 até Julho/2000
retorno_ativos = ipca_consolidado.copy()
for ativo, df in lista_de_dataframes_filtrados.items():
if ativo != 'ipca':
retorno_ativos = pd.merge(retorno_ativos, df, on='ano-mês', how='inner')
retorno_ativos.tail(5)
| ipca | ano-mês | ipca_acum_12m | ipca_acum_10y | selic | cdi_acum_365d | cdi_acum_3650d | dolar | ibovespa | sp500 | nasdaq | ouro | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 279 | 0.28 | 2023-11 | 4.72 | 58.25 | 12.25 | 0.133525 | 1.411175 | 4.8929 | 124819.0 | 4502.879883 | 14103.839844 | 1982.750000 |
| 280 | 0.56 | 2023-12 | 4.59 | 57.99 | 11.75 | 0.132300 | 1.415423 | 4.8990 | 130197.0 | 4713.139893 | 14769.750000 | 2030.349976 |
| 281 | 0.42 | 2024-01 | 4.53 | 57.63 | 11.75 | 0.129479 | 1.418554 | 4.9190 | 129130.5 | 4783.450195 | 14972.759766 | 2026.000000 |
| 282 | 0.83 | 2024-02 | 4.42 | 57.50 | 11.25 | 0.127150 | 1.419539 | 4.9687 | 129036.0 | 5003.094971 | 15826.430176 | 2028.000000 |
| 283 | 0.16 | 2024-03 | 4.41 | 57.64 | 11.25 | 0.125708 | 1.421993 | 4.9810 | 127690.5 | 5161.334961 | 16236.574707 | 2160.549927 |
retorno_ativos.shape
(284, 12)
# fórmula para obter o retorno anualizado através do juros compostos:
retorno = (1 + taxa) ^ anos
y = (1 + x)^10
y^(1/10) = 1+x
x = y^(1/10)-1
# gravando csv para persistência de dados e abrir no Excel
retorno_ativos.round(2).to_csv('retorno_ativos.csv', sep=';', decimal=',', index=False)
# obtendo valores com lag de 10 anos
retorno_ativos['dolar_lag10y'] = retorno_ativos['dolar'].shift(12*10)
retorno_ativos['ibovespa_lag10y'] = retorno_ativos['ibovespa'].shift(12*10)
retorno_ativos['nasdaq_lag10y'] = retorno_ativos['nasdaq'].shift(12*10)
retorno_ativos['sp500_lag10y'] = retorno_ativos['sp500'].shift(12*10)
retorno_ativos['ouro_lag10y'] = retorno_ativos['ouro'].shift(12*10)
retorno_ativos.tail(5)
| ipca | ano-mês | ipca_acum_12m | ipca_acum_10y | selic | cdi_acum_365d | cdi_acum_3650d | dolar | ibovespa | sp500 | nasdaq | ouro | dolar_lag10y | ibovespa_lag10y | nasdaq_lag10y | sp500_lag10y | ouro_lag10y | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 279 | 0.28 | 2023-11 | 4.72 | 58.25 | 12.25 | 0.133525 | 1.411175 | 4.8929 | 124819.0 | 4502.879883 | 14103.839844 | 1982.750000 | 2.29765 | 52688.0 | 3944.465088 | 1784.934998 | 1272.799988 |
| 280 | 0.56 | 2023-12 | 4.59 | 57.99 | 11.75 | 0.132300 | 1.415423 | 4.8990 | 130197.0 | 4713.139893 | 14769.750000 | 2030.349976 | 2.34490 | 50819.0 | 4060.489990 | 1805.089966 | 1226.000000 |
| 281 | 0.42 | 2024-01 | 4.53 | 57.63 | 11.75 | 0.129479 | 1.418554 | 4.9190 | 129130.5 | 4783.450195 | 14972.759766 | 2026.000000 | 2.37700 | 49311.0 | 4153.180176 | 1831.979980 | 1242.199951 |
| 282 | 0.83 | 2024-02 | 4.42 | 57.50 | 11.25 | 0.127150 | 1.419539 | 4.9687 | 129036.0 | 5003.094971 | 15826.430176 | 2028.000000 | 2.39300 | 47386.5 | 4240.669922 | 1829.829956 | 1317.099976 |
| 283 | 0.16 | 2024-03 | 4.41 | 57.64 | 11.25 | 0.125708 | 1.421993 | 4.9810 | 127690.5 | 5161.334961 | 16236.574707 | 2160.549927 | 2.33380 | 46589.0 | 4279.950195 | 1866.520020 | 1340.199951 |
# transforma ativos para valores percentuais
retorno_ativos['ipca_acum_12m'] = retorno_ativos['ipca_acum_12m']/100
retorno_ativos['ipca_acum_10y'] = retorno_ativos['ipca_acum_10y']/100
retorno_ativos['selic'] = retorno_ativos['selic']/100
retorno_ativos['cdi_acum_3650d'] = retorno_ativos['cdi_acum_3650d']+1
# renomeia colunas para manter consistência
retorno_ativos = (
retorno_ativos
.rename(columns = {
'cdi_acum_365d' : 'cdi_acum_12m',
'cdi_acum_3650d' : 'cdi_acum_10y',
})
)
retorno_ativos.tail(5)
| ipca | ano-mês | ipca_acum_12m | ipca_acum_10y | selic | cdi_acum_12m | cdi_acum_10y | dolar | ibovespa | sp500 | nasdaq | ouro | dolar_lag10y | ibovespa_lag10y | nasdaq_lag10y | sp500_lag10y | ouro_lag10y | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 279 | 0.28 | 2023-11 | 0.0472 | 0.5825 | 0.1225 | 0.133525 | 2.411175 | 4.8929 | 124819.0 | 4502.879883 | 14103.839844 | 1982.750000 | 2.29765 | 52688.0 | 3944.465088 | 1784.934998 | 1272.799988 |
| 280 | 0.56 | 2023-12 | 0.0459 | 0.5799 | 0.1175 | 0.132300 | 2.415423 | 4.8990 | 130197.0 | 4713.139893 | 14769.750000 | 2030.349976 | 2.34490 | 50819.0 | 4060.489990 | 1805.089966 | 1226.000000 |
| 281 | 0.42 | 2024-01 | 0.0453 | 0.5763 | 0.1175 | 0.129479 | 2.418554 | 4.9190 | 129130.5 | 4783.450195 | 14972.759766 | 2026.000000 | 2.37700 | 49311.0 | 4153.180176 | 1831.979980 | 1242.199951 |
| 282 | 0.83 | 2024-02 | 0.0442 | 0.5750 | 0.1125 | 0.127150 | 2.419539 | 4.9687 | 129036.0 | 5003.094971 | 15826.430176 | 2028.000000 | 2.39300 | 47386.5 | 4240.669922 | 1829.829956 | 1317.099976 |
| 283 | 0.16 | 2024-03 | 0.0441 | 0.5764 | 0.1125 | 0.125708 | 2.421993 | 4.9810 | 127690.5 | 5161.334961 | 16236.574707 | 2160.549927 | 2.33380 | 46589.0 | 4279.950195 | 1866.520020 | 1340.199951 |
# calcula retorno de ativos
# dolar
retorno_ativos['retorno_dolar_10y'] = retorno_ativos['dolar'] / retorno_ativos['dolar_lag10y']
retorno_ativos['retorno_dolar_10y_real'] = retorno_ativos['retorno_dolar_10y'] / (retorno_ativos['ipca_acum_10y'] + 1)
retorno_ativos['retorno_dolar_10y_anualizado'] = retorno_ativos['retorno_dolar_10y'] ** (1/10) - 1
retorno_ativos['retorno_dolar_10y_real_anualizado'] = retorno_ativos['retorno_dolar_10y_real'] ** (1/10) - 1
# calcula retorno de ativos
# ibovespa
retorno_ativos['retorno_ibovespa_10y'] = retorno_ativos['ibovespa'] / retorno_ativos['ibovespa_lag10y']
retorno_ativos['retorno_ibovespa_10y_anualizado'] = retorno_ativos['retorno_ibovespa_10y'] ** (1/10) - 1
retorno_ativos['retorno_ibovespa_10y_real'] = retorno_ativos['retorno_ibovespa_10y'] / (retorno_ativos['ipca_acum_10y'] + 1)
retorno_ativos['retorno_ibovespa_10y_real_anualizado'] = retorno_ativos['retorno_ibovespa_10y_real'] ** (1/10) - 1
# calcula retorno de ativos
# sp500
retorno_ativos['retorno_sp500_10y'] = retorno_ativos['sp500'] / retorno_ativos['sp500_lag10y']
retorno_ativos['retorno_sp500_10y_anualizado'] = retorno_ativos['retorno_sp500_10y'] ** (1/10) - 1
retorno_ativos['retorno_sp500_10y_real'] = retorno_ativos['retorno_sp500_10y'] / (retorno_ativos['ipca_acum_10y'] + 1)
retorno_ativos['retorno_sp500_10y_real_anualizado'] = retorno_ativos['retorno_sp500_10y_real'] ** (1/10) - 1
# calcula retorno de ativos
# nasdaq
retorno_ativos['retorno_nasdaq_10y'] = retorno_ativos['nasdaq'] / retorno_ativos['nasdaq_lag10y']
retorno_ativos['retorno_nasdaq_10y_anualizado'] = retorno_ativos['retorno_nasdaq_10y'] ** (1/10) - 1
retorno_ativos['retorno_nasdaq_10y_real'] = retorno_ativos['retorno_nasdaq_10y'] / (retorno_ativos['ipca_acum_10y'] + 1)
retorno_ativos['retorno_nasdaq_10y_real_anualizado'] = retorno_ativos['retorno_nasdaq_10y_real'] ** (1/10) - 1
# calcula retorno de ativos
# ouro
retorno_ativos['retorno_ouro_10y'] = retorno_ativos['ouro'] / retorno_ativos['ouro_lag10y']
retorno_ativos['retorno_ouro_10y_anualizado'] = retorno_ativos['retorno_ouro_10y'] ** (1/10) - 1
retorno_ativos['retorno_ouro_10y_real'] = retorno_ativos['retorno_ouro_10y'] / (retorno_ativos['ipca_acum_10y'] + 1)
retorno_ativos['retorno_ouro_10y_real_anualizado'] = retorno_ativos['retorno_ouro_10y_real'] ** (1/10) - 1
# calcula retorno de ativos
# cdi
retorno_ativos['retorno_cdi_10y'] = retorno_ativos['cdi_acum_10y']
retorno_ativos['retorno_cdi_10y_anualizado'] = retorno_ativos['retorno_cdi_10y'] ** (1/10) - 1
retorno_ativos['retorno_cdi_10y_real'] = retorno_ativos['retorno_cdi_10y'] / (retorno_ativos['ipca_acum_10y'] + 1)
retorno_ativos['retorno_cdi_10y_real_anualizado'] = retorno_ativos['retorno_cdi_10y_real'] ** (1/10) - 1
# calcula retorno de ativos
# nasdaq dolarizado
retorno_ativos['retorno_nasdaq_dolarizado_10y'] = (retorno_ativos['nasdaq'] / retorno_ativos['nasdaq_lag10y'])*(retorno_ativos['retorno_dolar_10y'])
retorno_ativos['retorno_nasdaq_dolarizado_10y_anualizado'] = retorno_ativos['retorno_nasdaq_dolarizado_10y'] ** (1/10) - 1
retorno_ativos['retorno_nasdaq_dolarizado_10y_real'] = (retorno_ativos['retorno_nasdaq_10y'] * retorno_ativos['retorno_dolar_10y']) / (retorno_ativos['ipca_acum_10y'] + 1)
retorno_ativos['retorno_nasdaq_dolarizado_10y_real_anualizado'] = retorno_ativos['retorno_nasdaq_dolarizado_10y_real'] ** (1/10) - 1
# calcula retorno de ativos
# sp500 dolarizado
retorno_ativos['retorno_sp500_dolarizado_10y'] = (retorno_ativos['sp500'] / retorno_ativos['sp500_lag10y'])*(retorno_ativos['retorno_dolar_10y'])
retorno_ativos['retorno_sp500_dolarizado_10y_anualizado'] = retorno_ativos['retorno_sp500_dolarizado_10y'] ** (1/10) - 1
retorno_ativos['retorno_sp500_dolarizado_10y_real'] = (retorno_ativos['retorno_sp500_10y'] * retorno_ativos['retorno_dolar_10y']) / (retorno_ativos['ipca_acum_10y'] + 1)
retorno_ativos['retorno_sp500_dolarizado_10y_real_anualizado'] = retorno_ativos['retorno_sp500_dolarizado_10y_real'] ** (1/10) - 1
retorno_ativos.columns
Index(['ipca', 'ano-mês', 'ipca_acum_12m', 'ipca_acum_10y', 'selic',
'cdi_acum_12m', 'cdi_acum_10y', 'dolar', 'ibovespa', 'sp500', 'nasdaq',
'ouro', 'dolar_lag10y', 'ibovespa_lag10y', 'nasdaq_lag10y',
'sp500_lag10y', 'ouro_lag10y', 'retorno_dolar_10y',
'retorno_dolar_10y_real', 'retorno_dolar_10y_anualizado',
'retorno_dolar_10y_real_anualizado', 'retorno_ibovespa_10y',
'retorno_ibovespa_10y_anualizado', 'retorno_ibovespa_10y_real',
'retorno_ibovespa_10y_real_anualizado', 'retorno_sp500_10y',
'retorno_sp500_10y_anualizado', 'retorno_sp500_10y_real',
'retorno_sp500_10y_real_anualizado', 'retorno_nasdaq_10y',
'retorno_nasdaq_10y_anualizado', 'retorno_nasdaq_10y_real',
'retorno_nasdaq_10y_real_anualizado', 'retorno_ouro_10y',
'retorno_ouro_10y_anualizado', 'retorno_ouro_10y_real',
'retorno_ouro_10y_real_anualizado', 'retorno_cdi_10y',
'retorno_cdi_10y_anualizado', 'retorno_cdi_10y_real',
'retorno_cdi_10y_real_anualizado', 'retorno_nasdaq_dolarizado_10y',
'retorno_nasdaq_dolarizado_10y_anualizado',
'retorno_nasdaq_dolarizado_10y_real',
'retorno_nasdaq_dolarizado_10y_real_anualizado',
'retorno_sp500_dolarizado_10y',
'retorno_sp500_dolarizado_10y_anualizado',
'retorno_sp500_dolarizado_10y_real',
'retorno_sp500_dolarizado_10y_real_anualizado'],
dtype='object')
colunas_interesse = [
'ano-mês', 'ipca_acum_10y', 'cdi_acum_10y', 'ibovespa', 'ibovespa_lag10y',
'sp500', 'sp500_lag10y', 'dolar', 'dolar_lag10y', 'ouro', 'ouro_lag10y',
'nasdaq', 'nasdaq_lag10y',
'retorno_cdi_10y_real_anualizado', 'retorno_cdi_10y_anualizado',
'retorno_dolar_10y_anualizado',
'retorno_dolar_10y_real_anualizado',
'retorno_ibovespa_10y_anualizado',
'retorno_ibovespa_10y_real_anualizado',
'retorno_sp500_10y_anualizado',
'retorno_sp500_10y_real_anualizado',
'retorno_nasdaq_10y_anualizado',
'retorno_nasdaq_10y_real_anualizado',
'retorno_ouro_10y_anualizado',
'retorno_ouro_10y_real_anualizado',
'retorno_nasdaq_dolarizado_10y_anualizado',
'retorno_nasdaq_dolarizado_10y_real_anualizado',
'retorno_sp500_dolarizado_10y_anualizado',
'retorno_sp500_dolarizado_10y_real_anualizado'
]
retorno_ativos_resumido = retorno_ativos[colunas_interesse]
retorno_ativos_resumido.tail(5)
| ano-mês | ipca_acum_10y | cdi_acum_10y | ibovespa | ibovespa_lag10y | sp500 | sp500_lag10y | dolar | dolar_lag10y | ouro | ouro_lag10y | nasdaq | nasdaq_lag10y | retorno_cdi_10y_real_anualizado | retorno_cdi_10y_anualizado | retorno_dolar_10y_anualizado | retorno_dolar_10y_real_anualizado | retorno_ibovespa_10y_anualizado | retorno_ibovespa_10y_real_anualizado | retorno_sp500_10y_anualizado | retorno_sp500_10y_real_anualizado | retorno_nasdaq_10y_anualizado | retorno_nasdaq_10y_real_anualizado | retorno_ouro_10y_anualizado | retorno_ouro_10y_real_anualizado | retorno_nasdaq_dolarizado_10y_anualizado | retorno_nasdaq_dolarizado_10y_real_anualizado | retorno_sp500_dolarizado_10y_anualizado | retorno_sp500_dolarizado_10y_real_anualizado | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 279 | 2023-11 | 0.5825 | 2.411175 | 124819.0 | 52688.0 | 4502.879883 | 1784.934998 | 4.8929 | 2.29765 | 1982.750000 | 1272.799988 | 14103.839844 | 3944.465088 | 0.043010 | 0.092001 | 0.078520 | 0.030134 | 0.090076 | 0.041172 | 0.096950 | 0.047737 | 0.135886 | 0.084927 | 0.045324 | -0.001573 | 0.225076 | 0.170116 | 0.183083 | 0.130006 |
| 280 | 2023-12 | 0.5799 | 2.415423 | 130197.0 | 50819.0 | 4713.139893 | 1805.089966 | 4.8990 | 2.34490 | 2030.349976 | 1226.000000 | 14769.750000 | 4060.489990 | 0.043365 | 0.092193 | 0.076461 | 0.028337 | 0.098645 | 0.049529 | 0.100731 | 0.051522 | 0.137835 | 0.086967 | 0.051739 | 0.004720 | 0.224836 | 0.170078 | 0.184894 | 0.131922 |
| 281 | 2024-01 | 0.5763 | 2.418554 | 129130.5 | 49311.0 | 4783.450195 | 1831.979980 | 4.9190 | 2.37700 | 2026.000000 | 1242.199951 | 14972.759766 | 4153.180176 | 0.043738 | 0.092334 | 0.075436 | 0.027592 | 0.101054 | 0.052070 | 0.100733 | 0.051764 | 0.136821 | 0.086246 | 0.050134 | 0.003416 | 0.222579 | 0.168189 | 0.183769 | 0.131105 |
| 282 | 2024-02 | 0.5750 | 2.419539 | 129036.0 | 47386.5 | 5003.094971 | 1829.829956 | 4.9687 | 2.39300 | 2028.000000 | 1317.099976 | 15826.430176 | 4240.669922 | 0.043867 | 0.092379 | 0.075796 | 0.028021 | 0.105365 | 0.056276 | 0.105816 | 0.056707 | 0.140761 | 0.090101 | 0.044107 | -0.002261 | 0.227227 | 0.172727 | 0.189632 | 0.136802 |
| 283 | 2024-03 | 0.5764 | 2.421993 | 127690.5 | 46589.0 | 5161.334961 | 1866.520020 | 4.9810 | 2.33380 | 2160.549927 | 1340.199951 | 16236.574707 | 4279.950195 | 0.043880 | 0.092490 | 0.078761 | 0.030763 | 0.106082 | 0.056868 | 0.107065 | 0.057807 | 0.142630 | 0.091790 | 0.048913 | 0.002243 | 0.232625 | 0.177780 | 0.194258 | 0.141121 |
# checks
# cdi
# ibovespa
# sp500
# sp500 dolarizado
# ouro

retorno_ativos_resumido.dropna().to_csv('retorno_ativos_resumido.csv', sep=';', decimal=',', index=False)

Recentemente, realizei uma análise interessante sobre o desempenho real (descontada a inflação) de diversos ativos financeiros ao longo dos últimos anos. Comparei o CDI, Ibovespa, Nasdaq, S&P 500 e um investimento teórico em IPCA+6%. Compartilho com vocês algumas conclusões dessa análise:
Hoje: IPCA+6% supera tanto o Ibovespa quanto o CDI nos últimos 10 anos. No entanto, IPCA+6% perde para os índices americanos Nasdaq e S&P 500, já contabilizados os efeitos cambiais.
De 2014 até hoje: IPCA+6% apresenta um desempenho superior ao Ibovespa. Um insight interessante, trazendo menor risco e mais ganho. 2016-2018: O retorno do Ibovespa nos últimos 10 anos ficou abaixo da inflação do mesmo período, o que destaca a importância de considerar a inflação ao avaliar os retornos.
2010-2013: Tanto o CDI quanto o Ibovespa superaram o IPCA+6% e o S&P 500, indicando uma reversão em relação ao cenário atual.
Essas observações ressaltam a importância de diversificar investimentos e de considerar o contexto econômico ao longo do tempo. Avaliar o retorno real descontado pela inflação é essencial para uma compreensão mais precisa do desempenho dos ativos. Esses resultados podem nos ensinar muito sobre estratégias de investimento. A análise histórica mostra que, embora o IPCA+6% ofereça um retorno robusto e seguro em muitos cenários, os índices americanos como Nasdaq e S&P 500 têm se mostrado extremamente competitivos, especialmente nos últimos anos.